以 InnoDB为例,剖析mysql在事务支持方面的特定实现
1、事务隔离级别
当数据库多个事务同时执行的时候,可能出现脏读、幻读、不可重复读的问题,为了解决这些问题,就有了事务隔离的概念。
事务隔离级别
-
读未提交
一个事务没提交时,它的变更可以被其他事务看到 -
读提交
一个事务提交后,他的变更才会被其他事务看到 -
可重复读
一个事务执行过程中看到的数据,和这个事务启动时看到的数据一致(未提交变更对其他事务不可见) -
串行化
对同一行数据,写会加 写锁,读会加读锁,当出现读写锁冲突,后访问的事务必须在前一个事务执行完成,才能继续执行。
示例
C 字段的值为1
读未提交:v1=2,v2 =2 v3 =2
读提交: v1=1,v2=2,v3=2
可重复读: v1 =1,v2 = 1 v3 = 2
串行化: A 查询数据 设置 读锁,此时 B修改 设置写锁 会被锁住,需要等到 A 提交后 B才可继续执行。所以:v1=1,v2=1 v3=2
Oracle数据库的默认隔离级别其实就是“读提交”,因此对于一些从Oracle迁移到MySQL的应用,为保证数据库隔离级别的一致,你一定要记得将MySQL的隔离级别设置为“读提交”。
事务隔离的实现
在Mysql中每次修改操作都会记录一条 回滚操作
当系统判断没有事务需要用到这些回滚日志,回滚日志会被删除。
不要用长事务
长事务意味着,系统里会存在很老的事务视图,保留了大量的回滚日志,导致占用大量的存储空间。