事务

寵の児 提交于 2019-11-28 16:14:56

事务

一、关键字段

  • START TRANSACTION或BEGIN:开启事务
  • COMMIT:提交事务
  • ROLLBACK:回滚事务
  • CHAIN:提交或回滚之后立即开始一个新事务(并且与刚才的事务具有相同的隔离级别)
  • RELEASE:提交或回滚之后断开和客户端连接
  • SET AUTOCOMMIT:连接提交方式,如果设置了SET AUTO-COMMIT=0,则设置之后所有事务都需要通过明确的命令进行提交回滚

二、使用事务

注意

  • start transaction开始一个新事务会造成一个隐含的unlock table;操作
  • DDL语句是不能回滚的,并且部份的DDL语句会造成隐式的提交
# 事务演示表
create table transaction_demo (
    id int auto_increment primary key,
    note varchar(20)
);

2.1、开始事务->提交

# 开始事务
start transaction;

insert into transaction_demo values (1, 'a');

# 提交事务
# 此时中间的数据库操作才会真下的执行
commit;

# 查看结果
select * from transaction_demo;
+----+------+
| id | note |
+----+------+
|  1 | a    |
+----+------+

2.2、开始事务->提交立即开始新事务->提交

# 开始事务
start transaction;

insert into transaction_demo values(2, 'b');

# 提交并开始一个新的事务
commit and chain;

insert into transaction_demo values(3, 'c');

# 提交事务
commit;

# 查看结果
select * from transaction_demo;
+----+------+
| id | note |
+----+------+
|  1 | a    |
|  2 | b    |
|  3 | c    |
+----+------+

2.3、开始事务->回滚

# 开始事务
start transaction;

insert into transaction_demo values(4, 'd');

# 回滚
# 放弃数据库修改
rollback;

# 查看结果
select * from transaction_demo;
+----+------+
| id | note |
+----+------+
|  1 | a    |
|  2 | b    |
|  3 | c    |
+----+------+

2.4、开始事务->保存点->回滚保存点->提交

# 开始事务
start transaction;

insert into transaction_demo values(4, 'd');

# 保存点1
savepoint point1;

insert into transaction_demo values(5, 'e');

# 回滚去保存点1
rollback to savepoint point1;

# 提交
commit;

# 查看结果
select * from transaction_demo;
+----+------+
| id | note |
+----+------+
|  1 | a    |
|  2 | b    |
|  3 | c    |
|  4 | d    |
+----+------+

参考

  • 《深入浅出MySQL第2版》唐汉明、翟振兴、关宝军、王洪权、黄潇著
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!