SAVEPOINT保存点

SAVEPOINT

保存点仅在当前事物中起作用。
A savepoint is a special mark inside a transaction that allows all commands that are executed after it was established to be rolled back, restoring the transaction state to what it was at the time of the savepoint.


PG支持保存点,在一个大事物中,可以把操作过程分成几部分,第一个部分成功后,可以建一个保存点,若后面的执行失败,则回滚到这个保存点,而不必把整个事物都回滚掉。

highgo=# begin;
BEGIN
highgo=# select * from test;
 id | name 
----+------
  1 | 
(1 row)


highgo=# insert into test values (1);
INSERT 0 1
highgo=# insert into test values (2);
INSERT 0 1
highgo=# savepoint test_savepoint_01;
SAVEPOINT
highgo=# 
highgo=# insert into test values (3);
INSERT 0 1
highgo=# select * from test;
 id | name 
----+------
  1 | 
  1 | 
  2 | 
  3 | 
(4 rows)


highgo=# rollback to savepoint test_savepoint_01;
ROLLBACK
highgo=# select * from test;
 id | name 
----+------
  1 | 
  1 | 
  2 | 
(3 rows)


highgo=# 


highgo=# insert into test values (3);
INSERT 0 1
highgo=# select * from test;
 id | name 
----+------
  1 | 
  1 | 
  2 | 
  3 | 
(4 rows)




To establish and later destroy a savepoint:


highgo=# select * from test;
 id | name 
----+------
(0 rows)


highgo=# BEGIN;
BEGIN
highgo=#     INSERT INTO test VALUES (3);
INSERT 0 1
highgo=#     SAVEPOINT my_savepoint;
SAVEPOINT
highgo=#     INSERT INTO test VALUES (4);
INSERT 0 1
highgo=#     RELEASE SAVEPOINT my_savepoint;    --销毁savepoint
RELEASE
highgo=# COMMIT;
COMMIT
highgo=# select * from test;
 id | name 
----+------
  3 | 
  4 | 
(2 rows)


****************************************************************************************
[highgo@sourcedb ~]$ psql
psql (3.1.4)
Type "help" for help.


highgo=# begin;
BEGIN
highgo=# insert into test values (1);
INSERT 0 1
highgo=# savepoint my_savepoint;
SAVEPOINT
highgo=# insert into test values (2);
INSERT 0 1
highgo=# rollback to savepoint my_savepoint;
ROLLBACK
highgo=# select * from test;
 id | name 
----+------
  1 | 
(1 row)


highgo=# insert into test values (2);
INSERT 0 1
highgo=# insert into test values ('2');
INSERT 0 1
highgo=# insert into test values ('aaa');
错误:  无效的整数类型输入语法: "aaa"
LINE 1: insert into test values ('aaa');
                                 ^
highgo=# select * from test;
错误:  当前事务被终止, 事务块结束之前的查询被忽略
highgo=# rollback to savepoint my_savepoint;                 --在一个事物中,一条语句执行失败,有savepoint的情况下可以rollback到sacepoint;没有saveepoint则回退所有事物
ROLLBACK
highgo=# select * from test;
 id | name 
----+------
  1 | 
(1 row)
************************************************************************************
highgo=# begin;
BEGIN
highgo=# 
highgo=# select * from test;
 id | name 
----+------
(0 rows)


highgo=# insert into test values (1);
INSERT 0 1
highgo=# insert into test values (2);
INSERT 0 1
highgo=# insert into test values ('aaaa');
错误:  无效的整数类型输入语法: "aaaa"
LINE 1: insert into test values ('aaaa');
                                 ^
highgo=# select * from test;
错误:  当前事务被终止, 事务块结束之前的查询被忽略   
highgo=# rollback;
ROLLBACK
highgo=# select * from test;
 id | name 
----+------
(0 rows)


highgo=# 
----------------------------------------------
[highgo@sourcedb ~]$ psql
psql (3.1.4)
Type "help" for help.


highgo=# begin;
BEGIN
highgo=# select * from test;
 id | name 
----+------
(0 rows)


highgo=# insert into test values (1);
INSERT 0 1
highgo=# insert into test values (2);
INSERT 0 1
highgo=# insert into test values ('aaaa');
错误:  无效的整数类型输入语法: "aaaa"
LINE 1: insert into test values ('aaaa');
                                 ^
highgo=# select * from test;
错误:  当前事务被终止, 事务块结束之前的查询被忽略
highgo=# 
highgo=# \q
[highgo@sourcedb ~]$ psql
psql (3.1.4)
Type "help" for help.


highgo=# select * from test;
 id | name 
----+------
(0 rows)


highgo=# 
<think>好的,用户现在想知道如何在MySQL中设置SAVEPOINT数据保存点。我需要根据提供的引用内容来整理回答,同时还要生成相关问题。 首先,查看用户提供的引用信息。引用1提到SAVEPOINT属于事务控制处理部分,可以回滚指定部分事务。引用3详细说明了MySQL的事务处理命令,包括SAVEPOINT的使用步骤和相关语句。 接下来,我需要按照用户的系统级指令来组织回答。必须使用中文,结构清晰,分步骤说明设置保存点的方法。同时,要确保所有数学表达式和公式用正确的LaTeX格式,不过这个问题可能不需要数学公式,所以可能不需要处理这部分。然后需要生成相关问题,放在最后。 步骤应该是: 1. 开启事务:使用START TRANSACTION或BEGIN。 2. 设置保存点SAVEPOINT savepoint_name。 3. 执行操作:比如INSERT、UPDATE等。 4. 回滚到保存点:ROLLBACK TO savepoint_name。 5. 提交或释放保存点:COMMIT或RELEASE SAVEPOINT。 需要注意的要点包括:保存点必须在事务内设置,可以设置多个,回滚不影响之前的保存点,不能回退SELECT语句等。 然后生成相关问题,比如如何回滚到保存点保存点的限制,多个保存点如何处理,如何删除保存点,与事务的关系等。 还需要检查是否有引用需要标注。例如,引用3提到事务处理的相关命令,所以在对应的步骤后面添加引用标识[^3]。同时,引用2提到保存点的查询问题,可能在注意事项中提到无法直接查询,需要添加引用[^2]。 确保回答中没有使用Markdown格式,语言口语化,但结构清晰。最后检查是否符合所有系统指令,特别是引用标注和问题生成部分。</think>### 如何在 MySQL 中设置 SAVEPOINT 数据保存点 在 MySQL 中,`SAVEPOINT` 是事务控制的重要功能,允许在事务中设置标记点,以便后续回滚到指定位置。以下是具体步骤和注意事项: --- #### **设置保存点的步骤** 1. **开启事务** 使用 `START TRANSACTION` 或 `BEGIN` 显式开启事务: ```sql START TRANSACTION; -- 或 BEGIN; ``` 2. **设置保存点** 在事务执行过程中,通过 `SAVEPOINT` 语句创建保存点: ```sql SAVEPOINT savepoint_name; -- 例如 SAVEPOINT sp1 ``` 3. **执行数据操作** 在保存点后执行 INSERT、UPDATE 或 DELETE 等操作: ```sql UPDATE accounts SET balance = balance - 100 WHERE user_id = 1; ``` 4. **回滚到保存点(可选)** 若需要撤销部分操作,可通过 `ROLLBACK TO` 回滚到指定保存点: ```sql ROLLBACK TO savepoint_name; -- 例如 ROLLBACK TO sp1 ``` 5. **提交或释放保存点** - 提交事务(所有操作生效): ```sql COMMIT; ``` - 释放保存点(非必需,事务提交后自动释放): ```sql RELEASE SAVEPOINT savepoint_name; ``` --- #### **关键注意事项** 1. **事务内生效** 保存点仅在事务内有效,未开启事务时无法设置[^3]。 2. **多个保存点** 一个事务可设置多个保存点,例如: ```sql SAVEPOINT sp1; UPDATE table1 ...; SAVEPOINT sp2; INSERT INTO table2 ...; ``` 回滚到 `sp1` 会同时撤销 `sp2` 后的操作。 3. **回滚限制** - 不能回退 `SELECT` 或 `CREATE/DROP` 等 DDL 操作。 - 回滚到保存点后,该保存点之后的保存点会被清除。 4. **保存点管理** MySQL 不提供直接查询已设置保存点的方法,需通过代码或日志跟踪。 --- #### **示例场景** ```sql START TRANSACTION; SAVEPOINT before_update; UPDATE orders SET status = 'processed' WHERE id = 100; SAVEPOINT before_delete; DELETE FROM logs WHERE created_at < '2023-01-01'; -- 若发现 DELETE 操作有误,回滚到 before_delete ROLLBACK TO before_delete; -- 提交剩余操作(UPDATE 生效,DELETE 被撤销) COMMIT; ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值