Bạn cũng có thể sử dụng SAVEPOINTs trong giao dịch.
Mã giả Pythonish được minh họa từ phía ứng dụng:
database.execute("BEGIN")
foreach data_row in input_data_dictionary:
database.execute("SAVEPOINT bulk_savepoint")
try:
database.execute("INSERT", table, data_row)
except:
database.execute("ROLLBACK TO SAVEPOINT bulk_savepoint")
log_error(data_row)
error_count = error_count + 1
else:
database.execute("RELEASE SAVEPOINT bulk_savepoint")
if error_count > error_threshold:
database.execute("ROLLBACK")
else:
database.execute("COMMIT")
Chỉnh sửa:Đây là một ví dụ thực tế về điều này đang hoạt động trong psql dựa trên một biến thể nhỏ của ví dụ trong tài liệu (các câu lệnh SQL có tiền tố là ">"):
> CREATE TABLE table1 (test_field INTEGER NOT NULL PRIMARY KEY);
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "table1_pkey" for table "table1"
CREATE TABLE
> BEGIN;
BEGIN
> INSERT INTO table1 VALUES (1);
INSERT 0 1
> SAVEPOINT my_savepoint;
SAVEPOINT
> INSERT INTO table1 VALUES (1);
ERROR: duplicate key value violates unique constraint "table1_pkey"
> ROLLBACK TO SAVEPOINT my_savepoint;
ROLLBACK
> INSERT INTO table1 VALUES (3);
INSERT 0 1
> COMMIT;
COMMIT
> SELECT * FROM table1;
test_field
------------
1
3
(2 rows)
Lưu ý rằng giá trị 3 đã được chèn sau lỗi, nhưng vẫn nằm trong cùng một giao dịch!
Tài liệu cho SAVEPOINT có tại http://www.postgresql.org/docs/8.4/static/sql-savepoint.html.