1.事务自动提交设置
-- 设置自动提交状态,1:开启,0:关闭
set autocommit=0;
-- 查看当前自动提交状态
show variables like '%autocommit%';
2.事务隔离等级查看及设置
-- 事务隔离等及查看
select @@tx_isolation;
-- 设置read uncommitted级别:
set session transaction isolation level read uncommitted;
-- 设置read committed级别:
set session transaction isolation level read committed;
-- 设置repeatable read级别:
set session transaction isolation level repeatable read;
-- 设置serializable级别:
set session transaction isolation level serializable;
3.基础事务
语法为:begin; commit; rollback;
-- 开启事务,也可以用start transaction
begin ;
-- 数据库 DML
update table set filed = {vlaue} where ...;
-- 提交事务或回滚事务
commit;
rollback;
在commit之前可以进行一次select,查看是否会脏读(需要设置数据库隔离等级为READ_COMMITED以上)。
需要开启新的会话,Navicat开启新的查询窗口,不然查到的是没有commit的数据。
select filed from table where ...;
4.嵌套事务(savepoint)
4.1.基本操作
除了基础语法外,有额外3个语法:
- 声明一个保存点:savepoint savepoint_name;
- 回滚到指定保存点:rollback to savepoint_name;
- 删除指定保存点:release savepoint savepoint_name;
begin;
-- 执行一个insert语句,此时在同一个会话中查询,得到1条数据。
insert into table (fields) values ('v1');
-- 将上面执行的sql保存一个savepoint
savepoint p1;
-- 再执行一次insert,此时2条数据。
insert into table (fields) values ('v2');
savepoint p2;
-- 执行第三次insert,此时3条数据
insert into table (fields) values ('v3');
savepoint p3;
-- 回滚保存点p2,此时会查询到2条数据
ROLLBACK to p2;
-- 再回滚保存点p1,此时会查询到1条数据
ROLLBACK to p1;
-- commit或rollback
commit;
4.2.注意点
- commit和rollback会删除当前事务中的所有保存点。
- 保存点是按顺序记录的,用上面的例子来解释,如果回滚到p1,那么p2,p3就会自动删除掉。
- 同上,如果release了p1,p1后面的保存点都会被删掉。
5.执行中的事务查看
-- 正在执行的事务
select * from INFORMATION_SCHEMA.INNODB_TRX;
-- 当前获取锁的事务
select * from INFORMATION_SCHEMA.INNODB_LOCKS;
-- 当前等待锁的事务
select * from INFORMATION_SCHEMA.INNODB_LOCK_WAITS;