MySQL的事务隔离级别
事务的概念
事务由单独单元的一个或多个SQL语句组成,在这个单元中,每个MySQL语句是相互依赖的。而整个单独单元作为一个不可分割的整体,如果单元中某条SQL语句一旦执行失败或产生错误,整个单元将会回滚。所有受到影响的数据将返回到事物开始以前的状态;如果单元中的所有SQL语句均执行成功,则事物被顺利执行。
事务的四个属性
1、原子性:事务是由一个或一组相互关联的SQL语句组成,这些语句被认为是一个不可分割的单元,要么都成功要么全回滚。
2、一致性:对于数据库的修改是一致的,即多个用户查的的数据是一样的。一致性主要由mysql的日志机制处理,他记录数据的变化,为事务恢复提供跟踪记录。
3、隔离性:每个事务都有自己的空间,和其他发生在系统中的事务隔离开来,而且事务的结果只在他完全被执行时才能看到
4、持久性:但提交了这个事务之后对数据的修改更新就是永久的。当一个事务完成,数据库的日志已经被更新时,持久性即可发挥其特有的 功效,在mysql中,如果系统崩溃或者数据存储介质被破坏,通过日志,系统能够恢复在重启前进行的最后一次成功更新,可以反应系统崩溃时处于执行过程的事物的变化。
事务的隔离级别
1、读未提交(脏读)READ UNCOMMITTED
A事务读取到了B事务未提交的数据,脏读
2、读已提交(不可重复度)READ COMMITTED
A事务读取B事务提交的事务,B提交事务前后A读取的数据不一样,所以是不可重复度
3、可重复读(幻读)REPEATABLE READ 、innoDB默认的事务隔离级别,采用MVCC实现的可重复读
保证同一事务多次读取的数据是一致的,但是会产生幻读
可重复读:
A开启事务查询用户表数据
B开启事务修改了用户表数据并提交
A再查询用户表数据与第一次查询结果一致
幻读:(个人理解是这样,这里有些乱,不太确定是否正确,如果错了请纠正)
A开启事务将用户表所有年龄18的用户修改为年龄19
此时B开始事务,插入了一条年龄为18的用户数据后提交事务;
A查询用户表显示还有一条年龄18的用户数据,产生了幻觉
4、串行化 SERIALIZABLE
串行化是最高的隔离级别。它通过强制事务串行执行,避免了前面说的幻读的问题。简单来说,SERIALIZABLE会在读取每一行数据都加锁,所以可能导致大量的超时和锁争用问题。 在我们实际的开发应用中很少用到这个隔离级别,只有在非常需要确保数据的一致性而且可以接受系统没有并发情况的出现,才会考虑使用该级别。