<br />**开启事务**<br />begin;<br /> 或:<br /> start transaction;
提交
commit;
回滚
rollback;
开启事务之后,如果未提交或者回滚,此事务会一直持有锁,其他事务不能执行,等待释放锁,获取锁后才会执行
如果sql执行报错,不提交会自动回滚,如果提交了,就不再回滚,但是报错之后的不会执行
查看事务自动提交的模式
show [session] variables like ‘autocommit’; //会话级别
show global variables like ‘autocommit’; // 全局级别
关闭自动提交:
set global autocommit=0;
set [session] autocommit=0;
开启自动提交:
set global autocommit=1;
set [session] autocommit=1;
在代码里使用事务前
1. 需要先关闭自动提交
2. 然后开启事务,
3. 执行操作数据的SQL
4. 如果中间SQL语句抛异常了,就调rollback 回滚,将数据恢复到事务开始前的状态,事务结束
5. 如果中间SQL语句没有抛异常,就commit 提交,事务结束
分类
分别为:扁平事务,带有保存点的扁平事务,链事务,嵌套事务,分布式事务
扁平事务
最常用最简单的一种事务,所有的操作都在同一层次,使用正常的流程就可以,
缺点是:不能提交或回滚事务的某一部分,或者分几个独立的步骤去提交
带有保存点的扁平事务
除了支持扁平事务之外,最大区别就是允许在事务执行过程中回滚到同一事务中较早的状态,因为可能某些事务在执行过程中出现的错误并不会对所有的操作都无效,放弃整个事务不合乎要求,开销太大,
设置保存点,保存当前的状态,以便发生错误的时候可以回滚
通过ROLLBACK TO SAVEPOINT t1,我们就可以返回到保存点t1。
start transaction;
update `name` set name ='天天01' where id=1;
savepoint t1;
update `name` set name ='天天02' where id=1;
savepoint t2;
update `name` set name ='天天03' where id=1;
ROLLBACK TO SAVEPOINT t1;
-- rollback;
-- commit;
只是回滚到保存点,事务还没有结束,还在进行中,需要继续执行,提交,或者rollback 回滚
回滚到t1后 t2保存点就不存在了
链事务
在提交一个事务时,释放不需要的数据对象,将必要的处理上下文隐式的传给下一个要开始的事务
提交事务操作和下一个事务操作将合并为一个原子操作,就是下一个事务可以看到上一个事务的结果
开始链事务: set completion_type=1;
链事务执行完之后,提交或者归滚,接下来的命令也是事务,将链事务的结果作为数据,进行事务,但是不会改动链事务已经成功的操作,回滚也指挥回归滚到链事务的处理结果
链事务就是指回滚时,只能恢复到最近的一个保存点,带有保存点的扁平事务,可以回滚到任意正确的保存点
set completion_type=1;
update `name` set name ='改变第一次1' where id=1;
insert into `name`(name) values ('新加的1');
commit WORK;
//只会回滚到这
update `name` set name ='后来者' where id=1;
-- rollback;
commit;
嵌套事务
在事务中再嵌套事务,这种结构有点像一棵横着的树结构,位于根节点的事务称为顶层事务,事务的前驱称为父事务,下一层其他事务称为子事务
子事务既可以提交也可以回滚,但是提交操作并不会马上生效,除非尤其父事务提交,因此可以确定,任何子事务都在顶层事务提交后才真正的被提交了,同理,任何一个事务的回滚都会引起它所有子事务一同回滚
分布式事务
指在一个分布式的环境下运行的扁平事务,因此需要根据数据所在位置访问网络中的不同节点
在不同的物理地址,通过网络访问,执行不同的事务,这就是分布式事务
使用XA协议(看不懂),具体的就是事务管理器管理所有的事务,统一调度资源,