Transaction trong SQLite

Transaction trong SQLite là một đơn vị công việc được thực hiện bởi một Database. Transaction là đơn vị hoặc dãy công việc được thực hiện theo một thứ tự logic và hợp lý, có thể được thao tác bởi người dùng hoặc bởi một Database program.

Một transaction là một sự lan truyền của một hoặc nhiều thay đổi tới Database. Ví dụ, nếu bạn đang tạo một bản ghi hoặc cập nhật một bản ghi hoặc xóa một bản ghi từ một bảng, thì bạn đang thực hiện transaction trên bảng đó. Nó là quan trọng để điều khiển các transaction để bảo đảm toàn vẹn dữ liệu và để xử lý các Database Error.

Thực tế, bạn sẽ tập hợp nhiều truy vấn SQLite vào trong một nhóm và sẽ thực thi tất cả truy vấn này cùng với nhau như là một phần của một transaction.

Property của Transaction trong SQLite

Transaction có 4 property chuẩn, thường được tham chiếu bởi tên lược danh là ACID:

  • Atomicity: bảo đảm rằng tất cả hoạt động bên trong đơn vị công việc được hoàn thành một cách thành công; nếu không, transaction bị ngừng ở điểm thất bại, và các hoạt động trước được trao trả về trạng thái trước đó.
  • Consistency: bảo đảm rằng Database thay đổi một cách chính xác trạng thái theo một transaction đã được ký thác thành công.
  • Isolation: cho các transaction khả năng hoạt động một cách độc lập và không liên quan đến nhau.
  • Durability: bảo đảm rằng kết quả hoặc tác động của một transaction, mà đã được ký thác, vẫn còn tồn tại trong trường hợp hệ thống thất bại.

Điều khiển Transaction trong SQLite

Trong SQLite, có các lệnh sau được sử dụng để điều khiển transaction:

  • BEGIN TRANSACTION: Để bắt đầu một Transaction.
  • COMMIT: để lưu thay đổi, bạn thể sử dụng lệnh END TRANSACTION để thay thế.
  • ROLLBACK: để quay trở lại trạng thái trước khi có thay đổi.

Các lệnh điều khiển transaction chỉ được sử dụng với các lệnh INSERT, UPDATE và DELETE. Chúng không thể được sử dụng trong khi tạo và xóa bảng, bởi vì những hoạt động này được ký thác tự động trong Database.

Lệnh BEGIN TRANSACTION trong SQLite

Các Transaction có thể được bắt đầu bởi sử dụng lệnh BEGIN TRANSACTION hoặc để đơn giản bạn sử dụng BEGIN. Những Transaction này thường tồn tại tới khi gặp các lệnh COMMIT hoặc ROLLBACK tiếp theo. Nhưng một Transaction sẽ vẫn ROLLBACK nếu cơ sở dữ liệu bị đóng hoặc nếu xuất hiện một lỗi. Sau đây là cú pháp cơ bản để khởi đầu một Transaction:


BEGIN;

or 

BEGIN TRANSACTION;

Lệnh COMMIT trong SQLite

Lệnh COMMIT là lệnh điều khiển transaction được sử dụng để lưu các thay đổi đã được triệu hồi bởi một transaction tới Database.

Lệnh COMMIT lưu giữ tất cả transaction trong Database từ lệnh COMMIT hoặc ROLLBACK cuối cùng.

Cú pháp cơ bản của lệnh COMMIT là như sau:

COMMIT;

or

END TRANSACTION;

Lệnh ROLLBACK trong SQLite

Lệnh ROLLBACK là lệnh điều khiển transaction được sử dụng để trao trả transaction về trạng thái trước khi có các thay đổi mà chưa được lưu tới Database.

Lệnh ROLLBACK chỉ có thể được sử dụng để undo các transaction từ lệnh COMMIT hoặc ROLLBACK cuối cùng được thông báo.

Cú pháp cơ bản của lệnh ROLLBACK như sau:

ROLLBACK;

Ví dụ

Bạn theo dõi bảng COMPANY có các bản ghi sau:

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0
2           Allen       25          Texas       15000.0
3           Teddy       23          Norway      20000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0

Bây giờ, bắt đầu một Transaction và xóa các bản ghi từ bảng có age = 25 và sau đó sử dụng lệnh ROLLBACK để undo lại tất cả các thay đổi.

sqlite> BEGIN;
sqlite> DELETE FROM COMPANY WHERE AGE = 25;
sqlite> ROLLBACK;

Nếu bạn kiểm tra bảng COMPANY, thì bạn sẽ vẫn thấy các bản ghi sau:

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0
2           Allen       25          Texas       15000.0
3           Teddy       23          Norway      20000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0

Bây giờ, bắt đầu một Transaction khác và xóa các bản ghi từ bảng có age = 25, và cuối cùng sử dụng lệnh COMMIT để ký thác tất cả thay đổi.

sqlite> BEGIN;
sqlite> DELETE FROM COMPANY WHERE AGE = 25;
sqlite> COMMIT;

Nếu bạn kiểm tra bảng COMPANY lần nữa, bạn sẽ thấy các bản ghi sau:

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0
3           Teddy       23          Norway      20000.0
5           David       27          Texas       85000.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0

Bình luận