事务隔离级别设置
set global transaction isolation level read committed; //全局的
set session transaction isolation level read committed; //当前会话
复制代码
修改事务提交方式(是否自动提交,mysql默认自动提交)
SET AUTOCOMMIT = 1; //自动提交,为0手动提交
复制代码
不一样数据库引擎MVCC模式各不相同,典型有乐观和悲观并发控制。
innodb
说明:
InnoDB的MVCC,是经过在每行记录后面保存两个隐藏的列来实现的。这两个列,一个保存了行的建立时间,一个保存行的过时时间(或删除时间)。固然存储的并非实际的时间值,而是系统版本号(system version number).每开始个新的事务,系统版本号都会自动递增。事务开始时刻的系统版本号会做为事务的版本号,用来和查询到的
SELECT
InnoDB会根据如下两个条件检查每行记录:
a. InnoDB只查找版本早于当前事务版本的数据行(也就是,行的系统版本号小于或等于事务的系统版本号),这样能够确保事务读取的行,要么是在事务开始前已经存在的,要么是事务自身插人或者修改过的。
b.行的删除版本要么未定义,要么大于当前事务版本号。这能够确保事务读取到的行,在事务开始以前未被删除。
只有符合上述两个条件的记录,才能返回做为查询结果。
INSERT
InnoDB为新插人的每行 保存当前系统版本号做为行版本号。
DELETE
InnoDB为删除的每行保存当前系统版本号做为行删除标识。
UPDATE
InnoDB为插人行新记录,保存当前系统版本号做为行版本号,同时保存当前系统版本号到原来的行做为行删除标识。
注意:
MVCC只在REPEATABLE READ 和READ COMMITED 两个隔离级别下工做。其余两个隔离级别都和MVCC不兼容法,由于READ UNCOMITTED老是读取最新的数据行,而不是符合当前事务版本的数据行。而SERIALIZABLE则会对全部读取的行都加锁。
复制代码
查看当表的状态
show table status like 'task'\G;
复制代码
脏读、不可重复读、幻读
脏读:当前事务读到了另外一个事务未提交的状态,事务没有实现隔离。
不可重复读:实现了事务的隔离性,但两次读取同一条数据的时候发现数据不一致了。
幻读:两次查询同一批数据,发现有新数据被插入,主要是由于中途有其余事务对数据集进行了插入操做。(加了间隙锁解决该问题)
复制代码