官术网_书友最值得收藏!

Making use of SAVEPOINT

In professional applications, it can be pretty hard to write reasonably long transactions without ever encountering a single error. To solve the problem, users can utilize something called SAVEPOINT. As the name indicates, it is a safe place inside a transaction that the application can return to in the event things go terribly wrong. Here is an example:

test=# BEGIN; 
BEGIN 
test=# SELECT 1; ?column? ---------- 1 (1 row)
test=# SAVEPOINT a; SAVEPOINT
test=# SELECT 2 / 0; ERROR: division by zero
test=# SELECT 2; ERROR: current transaction is aborted, commands ignored until end of transaction block
test=# ROLLBACK TO SAVEPOINT a; ROLLBACK
test=# SELECT 3; ?column? ---------- 3
(1 row) 

test=# COMMIT; COMMIT

After the first SELECT clause, I decided to create SAVEPOINT to make sure that the application can always return to this point inside the transaction. As you can see, SAVEPOINT has a name, which is referred to later.

 After returning the savepoint called a, the transaction can proceed normally. The code has jumped back before the error, so everything is fine.

The number of savepoints inside a transaction is practically unlimited. We have seen customers with over 250,000 savepoints in a single operation. PostgreSQL can easily handle this.

If you want to remove a SAVEPOINT from inside a transaction, there is a RELEASE SAVEPOINT:

test=# \h RELEASE SAVEPOINT

Command: RELEASE SAVEPOINT

Description: Destroy a previously defined SAVEPOINT
Syntax:

RELEASE [ SAVEPOINT ] savepoint_name

Many people ask, what will happen if you try to reach a savepoint after a transaction has ended? The answer is, the life of a savepoint ends as soon as the transaction ends. In other words, there is no way to return to a certain point in time after the transactions have been completed.

主站蜘蛛池模板: 井陉县| 昌吉市| 基隆市| 奈曼旗| 武宣县| 军事| 波密县| 枣庄市| 改则县| 公主岭市| 东乡族自治县| 江北区| 桦甸市| 洛扎县| 准格尔旗| 泰和县| 四会市| 磐安县| 惠安县| 舞阳县| 三亚市| 达孜县| 甘泉县| 南岸区| 平乐县| 会东县| 那坡县| 平顶山市| 广汉市| 诸城市| 新乡县| 松溪县| 平果县| 枞阳县| 克拉玛依市| 新民市| 湄潭县| 丰县| 沙河市| 万盛区| 胶州市|