Trong PostgreSQL, một giao dịch, còn được gọi là transaction, là một phiên làm việc đặc biệt. Trong giao dịch, nhiều câu lệnh SQL có thể được thực hiện đồng thời. Tuy nhiên, nếu có bất kỳ vấn đề hoặc lỗi nào xảy ra trong quá trình thực hiện giao dịch, bạn có thể sử dụng lệnh ROLLBACK để hủy bỏ tất cả các thay đổi đã được thực hiện trong giao dịch đó. Kết quả là, dữ liệu trong cơ sở dữ liệu không bị ảnh hưởng hoặc thay đổi.
Transaction đảm bảo tính toàn vẹn của dữ liệu bằng cách đảm bảo rằng hoặc tất cả các thay đổi trong giao dịch đều được áp dụng thành công hoặc không có thay đổi nào được áp dụng. Điều này giúp đảm bảo rằng dữ liệu luôn ở trạng thái đáng tin cậy và nhất quán.
Các lệnh trong PostgreSQL Transactions
Các lệnh sau được sử dụng để kiểm soát các giao dịch –
- BEGIN TRANSACTION – Để bắt đầu một Transaction
- COMMIT – Để lưu các thay đổi vào database, hoặc bạn có thể sử dụng lệnh END TRANSACTION.
- ROLLBACK – Hủy transaction và không thay đổi dữ liệu trong database.
Transaction chỉ được sử dụng với các lệnh DML là: INSERT, UPDATE, DELETE.
Sử dụng PostgreSQL Transaction
Để bắt đầu một transaction sử dụng lệnh:
BEGIN TRANSACTION; -- Hoặc BEGIN:
Để hoàn thành một transaction sử dụng lệnh:
COMMIT; -- Hoặc END TRANSACTION;
Để hủy một transaction
ROLLBACK;
VD 1: Ta có bảng users như sau
Thêm dữ liệu cho bảng và commit dữ liệu:
BEGIN TRANSACTION; INSERT INTO public.users(user_id, group_id, username, password, email) VALUES (5, 1, 'HieuDT', '123456', 'hieudt@gmail.com'), (6, 1, 'PhatML', '123456', 'phatml@gmail.com'), (7, 1, 'Myttt', '123456', 'myttt@gmail.com'); COMMIT;
BEGIN TRANSACTION; INSERT INTO public.users(user_id, group_id, username, password, email, created_at) VALUES (8, 1, 'HangNT', '123456', 'hangnt@gmail.com', '2019-12-14 00:00:05'); ROLLBACK;
Kết quả dữ liệu của bảng users sau khi sử dụng Transaction
Nếu gặp lỗi:
ERROR: current transaction is aborted, commands ignored until end of transaction block
Câu lệnh SQL bị lỗi và giao dịch đang trong trạng thái không hoàn thành. Sử dụng lệnh ROLLBACK để hủy bỏ giao dịch hiện tại.