SQLite
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> SQLite

Giao dịch SQLite

Tóm tắt :trong hướng dẫn này, chúng tôi sẽ chỉ cho bạn cách sử dụng giao dịch SQLite để đảm bảo tính toàn vẹn và độ tin cậy của dữ liệu.

SQLite &ACID

SQLite là một cơ sở dữ liệu giao dịch mà tất cả các thay đổi và truy vấn là nguyên tử, nhất quán, cô lập và bền (ACID).

SQLite đảm bảo tất cả các giao dịch đều tuân thủ ACID ngay cả khi giao dịch bị gián đoạn do sự cố chương trình, kết xuất hệ thống hoạt động hoặc mất điện đối với máy tính.

  • Đ tomic:một giao dịch phải là nguyên tử. Nó có nghĩa là một thay đổi không thể được chia nhỏ thành những thay đổi nhỏ hơn. Khi bạn thực hiện một giao dịch, toàn bộ giao dịch có được áp dụng hay không.
  • C liên tục:một giao dịch phải đảm bảo thay đổi cơ sở dữ liệu từ trạng thái hợp lệ này sang trạng thái hợp lệ khác. Khi một giao dịch bắt đầu và thực hiện một câu lệnh để sửa đổi dữ liệu, cơ sở dữ liệu sẽ trở nên không nhất quán. Tuy nhiên, khi giao dịch được cam kết hoặc lùi lại, điều quan trọng là giao dịch đó phải giữ cho cơ sở dữ liệu nhất quán.
  • Tôi solation:một giao dịch đang chờ xử lý được thực hiện bởi một phiên phải được cách ly với các phiên khác. Khi một phiên bắt đầu một giao dịch và thực hiện INSERT hoặc UPDATE để thay đổi dữ liệu, những thay đổi này chỉ hiển thị cho phiên hiện tại, không hiển thị cho phiên khác. Mặt khác, các thay đổi được cam kết bởi các phiên khác sau khi giao dịch bắt đầu sẽ không được hiển thị cho phiên hiện tại.
  • Độ bền:nếu một giao dịch được cam kết thành công, các thay đổi phải tồn tại vĩnh viễn trong cơ sở dữ liệu bất kể điều kiện như mất điện hoặc sự cố chương trình. Ngược lại, nếu chương trình bị treo trước khi giao dịch được cam kết, thì thay đổi sẽ không tiếp tục.

Câu lệnh giao dịch SQLite

Theo mặc định, SQLite hoạt động ở chế độ tự động cam kết. Có nghĩa là đối với mỗi lệnh, SQLite sẽ tự động bắt đầu, xử lý và cam kết giao dịch.

Để bắt đầu một giao dịch một cách rõ ràng, bạn sử dụng các bước sau:

Đầu tiên, hãy mở một giao dịch bằng cách phát hành BEGIN TRANSACTION lệnh.

BEGIN TRANSACTION;Code language: SQL (Structured Query Language) (sql)

Sau khi thực hiện câu lệnh BEGIN TRANSACTION , giao dịch được mở cho đến khi nó được cam kết rõ ràng hoặc được khôi phục.

Thứ hai, đưa ra các câu lệnh SQL để chọn hoặc cập nhật dữ liệu trong cơ sở dữ liệu. Lưu ý rằng thay đổi chỉ hiển thị với phiên hiện tại (hoặc ứng dụng khách).

Thứ ba, cam kết các thay đổi đối với cơ sở dữ liệu bằng cách sử dụng COMMIT hoặc COMMIT TRANSACTION tuyên bố.

COMMIT;Code language: SQL (Structured Query Language) (sql)

Nếu bạn không muốn lưu các thay đổi, bạn có thể quay lại bằng cách sử dụng ROLLBACK hoặc ROLLBACK TRANSACTION tuyên bố:

ROLLBACK;Code language: SQL (Structured Query Language) (sql)

Ví dụ về giao dịch SQLite

Chúng tôi sẽ tạo hai bảng mới:accountsaccount_changes cho cuộc biểu tình.

Các tài khoản accounts bảng lưu trữ dữ liệu về số tài khoản và số dư của chúng. account_changes bảng lưu trữ các thay đổi của các tài khoản.

Đầu tiên, tạo accountsaccount_changes bằng cách sử dụng CREATE TABLE sau tuyên bố:

CREATE TABLE accounts ( 
	account_no INTEGER NOT NULL, 
	balance DECIMAL NOT NULL DEFAULT 0,
	PRIMARY KEY(account_no),
        CHECK(balance >= 0)
);

CREATE TABLE account_changes (
	change_no INT NOT NULL PRIMARY KEY,
	account_no INTEGER NOT NULL, 
	flag TEXT NOT NULL, 
	amount DECIMAL NOT NULL, 
	changed_at TEXT NOT NULL 
);Code language: SQL (Structured Query Language) (sql)

Thứ hai, chèn một số dữ liệu mẫu vào tài khoản accounts bảng.

INSERT INTO accounts (account_no,balance)
VALUES (100,20100);

INSERT INTO accounts (account_no,balance)
VALUES (200,10100);
Code language: SQL (Structured Query Language) (sql)

Thứ ba, truy vấn dữ liệu từ các tài khoản accounts bảng:

SELECT * FROM accounts;Code language: SQL (Structured Query Language) (sql)

Thứ tư, chuyển 1000 từ tài khoản 100 sang 200 và ghi các thay đổi vào bảng account_changes trong một giao dịch duy nhất.

BEGIN TRANSACTION;

UPDATE accounts
   SET balance = balance - 1000
 WHERE account_no = 100;

UPDATE accounts
   SET balance = balance + 1000
 WHERE account_no = 200;
 
INSERT INTO account_changes(account_no,flag,amount,changed_at) 
VALUES(100,'-',1000,datetime('now'));

INSERT INTO account_changes(account_no,flag,amount,changed_at) 
VALUES(200,'+',1000,datetime('now'));

COMMIT;Code language: SQL (Structured Query Language) (sql)

Thứ năm, truy vấn dữ liệu từ các tài khoản accounts bảng:

SELECT * FROM accounts;Code language: SQL (Structured Query Language) (sql)

Như bạn có thể thấy, số dư đã được cập nhật thành công.

Thứ sáu, truy vấn nội dung của account_changes bảng:

SELECT * FROM account_changes;Code language: SQL (Structured Query Language) (sql)

Hãy lấy một ví dụ khác về việc lùi một giao dịch.

Đầu tiên, cố gắng khấu trừ 20.000 từ tài khoản 100:

BEGIN TRANSACTION;

UPDATE accounts
   SET balance = balance - 20000
 WHERE account_no = 100;

INSERT INTO account_changes(account_no,flag,amount,changed_at) 
VALUES(100,'-',20000,datetime('now'));Code language: SQL (Structured Query Language) (sql)

SQLite đã phát hành lỗi do không đủ số dư:

[SQLITE_CONSTRAINT]  Abort due to constraint violation (CHECK constraint failed: accounts)Code language: CSS (css)

Tuy nhiên, nhật ký đã được lưu vào account_changes bảng:

SELECT * FROM account_changes;Code language: SQL (Structured Query Language) (sql)

Thứ hai, khôi phục giao dịch bằng cách sử dụng ROLLBACK tuyên bố:

ROLLBACK;Code language: SQL (Structured Query Language) (sql)

Cuối cùng, truy vấn dữ liệu từ account_changes bảng, bạn sẽ thấy rằng thay đổi số 3 không còn ở đó nữa:

SELECT * FROM account_changes;Code language: SQL (Structured Query Language) (sql)

Trong hướng dẫn này, bạn đã học cách xử lý các giao dịch SQLite bằng cách sử dụng BEGIN TRANSACTION , COMMITROLLBACK các câu lệnh để kiểm soát các giao dịch trong cơ sở dữ liệu SQLite.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQLite JSON ()

  2. Tạo Thực thể Phòng cho Bảng có trường có kiểu dữ liệu DÀI trong Sqlite

  3. SQLite COUNT

  4. Xóa nhiều hàng bằng cách sử dụng ID?

  5. Truy vấn con SQLite