PostgreSQL事務特性之嵌套事務


嵌套事務的實現是基於SAVEPOINTROLLBACK TO SAVEPOINTRELEASE SAVEPOINT的,也就是設置一個保存點,可以回滾到保存點和釋放保存點。

測試表的初始狀態如下:

postgres=# \d test Table "public.test" Column | Type | Modifiers --------+---------+----------- id | integer | name | text | postgres=# select * from test ; id | name ----+------ (0 rows)

 

開始測試

postgres=# begin ; BEGIN postgres=# insert into test values (1, 'a'); INSERT 0 1 postgres=# savepoint insert_a; SAVEPOINT postgres=# select * from test ; id | name ----+------ 1 | a (1 row) postgres=# insert into test values (2, 'b'); INSERT 0 1 postgres=# savepoint insert_b; SAVEPOINT postgres=# select * from test ; id | name ----+------ 1 | a 2 | b (2 rows) postgres=# insert into test values (3, 'c'); INSERT 0 1 postgres=# select * from test ; id | name ----+------ 1 | a 2 | b 3 | c (3 rows)

 

現在定義了兩個SAVEPOINT,並且插入了3條數據,現在測試ROLLBACK TO SAVEPOINT

postgres=# rollback to insert_b; ROLLBACK postgres=# select * from test ; id | name ----+------ 1 | a 2 | b (2 rows) postgres=# rollback to insert_a; ROLLBACK postgres=# select * from test ; id | name ----+------ 1 | a (1 row)

 

可見回滾到前面定義的保存點成功了。

如果回滾到前面的保存點,后面的更改就丟失了,包括保存點,比如回滾到insert_a,那么在insert_a之后的數據就沒有了,insert_b這個保存點也不存在了。

postgres=# rollback to insert_a; ROLLBACK postgres=# select * from test ; id | name ----+------ 1 | a (1 row) postgres=# rollback to insert_b; ERROR: no such savepoint

 

測試RELEASE SAVEPOINT

postgres=# select * from test ; id | name ----+------ (0 rows) postgres=# begin ; BEGIN postgres=# insert into test values (1, 'a'); INSERT 0 1 postgres=# savepoint insert_a; SAVEPOINT postgres=# select * from test ; id | name ----+------ 1 | a (1 row) postgres=# insert into test values (2, 'b'); INSERT 0 1 postgres=# savepoint insert_b; SAVEPOINT postgres=# select * from test ; id | name ----+------ 1 | a 2 | b (2 rows) postgres=# release insert_a; RELEASE postgres=# select * from test ; id | name ----+------ 1 | a 2 | b (2 rows) postgres=# rollback to insert_a; ERROR: no such savepoint

 

保存點被釋放后就不能再回滾到該保存點了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM