提到MySQL中的事务就会想到四个字母ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性),今天主要来说的是事物隔离。
1.事物隔离级别
Sql标准的事物隔离级别有四种:读未提交、读提交、可重复读、串行化。
读未提交:事物A还没提交,但是事物A所做的改变对事物B可见。
读提交: 事物A所做的改变只有在A提交后才对其他事物可见。
可重复读: 事物A在执行过程中看到的数据,与事物A在启动时看到的数据保持一致。
串行化:利用锁来实现排队,效率低。
2.事物隔离的实现
以“可重复读”隔离级别来说,MySQL中的事物隔离是靠回滚日志记录每一次更新的回滚操作来实现的。
数据库中应避免长事物,因为长事物会占用大量存储空间(大量回滚日志的原因),同时也会占用锁资源。
3.事物的开启方式
数据库中事物的开启一般使用begin transaction 或者start transaction 开始,以commit 提交结束或者rollback回滚。
业务开发中,强烈建议将mysql的事物提交方式设置为自动提交,即 set autocommit = 1, 然后通过显示语句(start transaction)来开启事物。
若设置 set autocommit = 0则关掉自动提交,如果执行一个select 语句则事物开启,直到你手动提交事物一个事物才结束,这样容易造成长事物。
为了避免在自动提交事物模式下需要每次显示开启事物,可以在提交语句时用commit work and chain语法,这样自动开启下一个事物。
4.检查长事物的方法
select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(), trx_started)) > 60;