Chào tất cả mọi người, với quan điểm thấy hay là share nên hôm nay em sẽ chia sẻ một bài viết ngắn về transaction trong sql cũng như cách sử dụng nó trong laravel.
I.Transaction là gì ? Vậy tại sao lại phải cần có transaction ?
Đơn giản là mình có một số ếch, mình muốn donate cho Phúc Idol 5 ếch. Nhưng trong quá trình chuyển ếch thì sau khi mình bị trừ đi 5 ếch thì đến đoạn cộng 5 ếch cho Phúc Idol bị lỗi, kết quả là mình mất 5 ếch nhưng Phúc Idol lại chẳng được cộng ếch nào. Thế thì làm sao mà chấp nhận được đúng không ạ ? Vì thế transaction được sinh ra để giải quyết vấn đề trên, hiểu nôm na là transaction được sinh ra để đảm bảo tuần tự và toàn vẹn dữ liệu.
II.Sử dụng transaction trong sql
Trong SQL để sử dụng transaction chúng ta có các câu lệnh như sau:
- COMMIT: cũng như git, no dùng để lưu các thay đổi.
- ROLLBACK: tương tự nó dùng để quay trở lại trạng thái trước khi có sự thay đổi.
- SAVEPOINT: tạo các điểm bên trong các nhóm Transaction để ROLLBACK về.
- SET TRANSACTION: đặt một tên cho một Transaction.
Ở đây trong SQL mình sẽ chỉ nêu ra các keyword mọi người có thể search trên Google sẽ có rất nhiều tài liệu cụ thể hơn về transaction trong SQL.
III. Sử dụng transaction trong Laravel.
Để thực thi transaction một cách đơn giản nhất trong Laravel chúng ta chỉ cần như thế này:
Nếu một trong những query bị lỗi, transaction sẽ tự động rollback lại. Nếu thực thi thành công, transaction sẽ tự động commit.
Transaction có một tham số thứ 2, nếu xảy ra lỗi nó sẽ cố gắng thực hiện lại transaction này với số lần truyền vào ở tham số thứ 2 nếu sau đủ số lần thực hiện vẫn không được mới đưa ra lỗi.
Để có thể kiểm soát tốt hơn thì chúng ta sẽ tìm hiểu sử dụng transaction trong laravel một cách thủ công nhé ^^
Chúng ta sẽ có 3 thứ cần quan tâm ở đây:
DB::beginTransaction(); => khởi tạo transaction
DB::commit(); => commit dữ liệu khi hoàn thành
DB::rollBack(); => rollback lại dữ liệu
Tiếp tục như ví dụ ở trên ta sẽ có:
Cũng thật đơn giản đúng không ạ!
Cảm ơn mọi người đã đọc bài, chúc mọi người một ngày làm việc vui vẻ <3