本文共 975 字,大约阅读时间需要 3 分钟。
innodb引擎默认autocommit为on,也就是自动提交打开。事实上我们希望一个事务整体操作完毕后再统一提交。
查看当前autocommit的命令有:show variables like ‘%autocommit%’;
或
Select @@autocommit;
如果一个事务没有commit,虽然通过select能够看到表中数据改变了,但断开数据库连接之后数据并没有改变。没有commit之前rollback能够回滚。Commit之后,rollback将不再起作用。
set autocommit=0;
那么,一个事务的提交过程可以概括为:
Innodb引擎下,一个事务的sql语句大概如:set autocommit=0;//关闭默认的自动提交begin; //开启事务update tb_gotesting set name='hh' where id=3113; //完成指定操作commit; //提交set autocommit=1; //恢复默认的自动提交
select @@tx_isolation;
set session transaction isolation level read committed;set session transaction isolation level repeatable read;
mysql默认是repeatable read 隔离级别。在这种级别之下,能够有效防止脏读、幻读、不可重复读。以repeatable read作为隔离级别进行演示。
对脏读的处理
A事务没有commit的数据,在B事务中没有读到。可重复读的效果
提交读(不可重复读)和可重复读的区别在于,前者在本事务未提交之前其他事务的增删改操作提交后会影响读的结果。读的是最新结果。
可重复读在读的过程中数据始终是事务启动时的数据状态,未提交之前其他事物的增删改操作提交后都不会影响读的结果。读的是快照结果。 提交读的演示:改操作
增操作