Postgres không hỗ trợ các giao dịch lồng nhau, nhưng chúng khác với SQL thông thường, giống như các giao dịch với các điểm từng phần được lồng vào nhau.
Ở cấp cao nhất, bạn luôn có BEGIN/COMMIT/ROLLBACK
điển hình của mình và ở các mức lồng nhau, bạn phải sử dụng các lệnh sau:
-
SAVEPOINT name
- tạo một điểm lưu mới, với tên duy nhất cho giao dịch -
RELEASE SAVEPOINT name
- cam kết điểm lưu, mặc dù nó sẽ chỉ tồn tại nếu giao dịch chứa cam kết -
ROLLBACK TO SAVEPOINT name
- quay trở lại điểm lưu
Bạn cũng phải đảm bảo rằng:
- Các tên được sử dụng cho mỗi
SAVEPOINT
là duy nhất; - Không thành công trong một
SAVEPOINT
được truyền lên cấp cao nhất.
Phần cuối cùng là một chút phức tạp, trừ khi bạn sử dụng một thư viện có thể tự động làm điều đó cho bạn.
Khi tôi viết pg-promise, tôi đã đảm bảo rằng hai điều khoản đó được đảm bảo:
- Nó tự động tạo tên điểm lưu, dưới dạng
level_1
,level_2
, v.v., dựa trên cấp độ giao dịch; - Nó thực thi có chứa tên
ROLLBACK TO SAVEPOINT name
, cộng vớiROLLBACK
cấp cao nhất trong trường hợp giao dịch con không thành công - tất cả đều được xây dựng dựa trên logic chuỗi lời hứa tiêu chuẩn.
Xem thêm các hạn chế của các giao dịch lồng nhau PostgreSQL được giải thích ...