PhuongNamCorpsIntern / workspace

Phuong Nam Corps Internship Workspace
3 stars 8 forks source link

DB::beginTransaction() DB::commit() #21

Open haiquang9994 opened 8 years ago

haiquang9994 commented 8 years ago

Khì tác vụ cần chạy nhiều dòng insert, update (vài trăm dòng :D) như Import từ file Excel. Thì ta đặt toàn bộ code xữ lý của Model giữa 2 câu lệnh sau.

DB::beginTransaction();
// code model
DB::commit();

use Sifoni\Model\DB; Mới thử insert 1000 dòng mà mất có 2 3 giây :D

khanhicetea commented 8 years ago

👍

Giải thích

Đây là cơ chế dội nước 1 lần 🚽 😄

MySQL Server và MySQL Client sẽ mở 1 connection (đường ống), khi save một cách bình thường (auto-commit) thì Client sẽ dội nước từng record, khoảng thời gian tiền - hậu xử lý cho mỗi lần là X, vậy nếu dội N lần thì sẽ tiêu tốn N * X

Do đó nếu cần cắt giảm tiêu tốn vô ích, ta trữ nước vào 1 pool (hồ) rồi dội một lần luôn cho tiết kiệm (cái này k nên ứng dụng ngoài đời nhé 🚽 )

Ngoài ra, nếu sử dụng Transaction này có thể đảm bảo được sự đúng đắn về data, như việc có lỗi (kẹt đường ống giữa chừng) thì ta có thể rollback về trạng thái ban đầu. Ứng dụng này sử dụng trong các giao dịch mang tính trao đổi. Ví dụ ông A chuyển tiền cho bà B, nếu giữa đường đứt gánh thì tiền phải về ông A và bà B không nhận được đồng nào, tránh trường hợp cộng tiền ông A rồi ko kịp trừ tiền bà B đã sinh ra lỗi.