一文搞懂mysql的事务隔离级别

一文搞懂mysql的事务隔离级别

  • 1.事务的概念以及特性
  • 2.线程并发带来的问题
  • 3.脏读,不可重复读和幻读的演示
  • 4.四种事务隔离级别介绍

1.事务的概念以及特性

1.1)概念,一个或者一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。

1.2)特性
1.2.1) 原子性,原子性是指事务是一个不可分割的工作单位,事务中的操作要么都执行,要么都不执行。
1.2.2) 一致性,一个事务执行会使数据从一个一致状态切换到另外一个一致状态。
1.2.3) 隔离性,一个事务的执行不应该受到其他事务的干扰。
1.2.4) 持久性,一个事务一旦提交,则会永久地改变数据库的数据。

2.线程并发带来的问题

2.1)脏读(相对于更新数据时出现)
对于两个事务T1,T2,T1读取了T2更新但是没有提交的字段,之后,若是T2回滚了,T1读取的内容就是临时无效的。

2.2)不可重复读
对于两个事务T1,T2,T1读取了表的一个字段,然后T2更新了该字段之后,T1再次读取同一个字段,值就不同了。

2.3)幻读(相对于插入数据时出现)
对于两个事务T1,T2,T1从一个表中了读取了一个字段,然后T2在该表插入了一些新的行,之后,如果T1再次读取这个表的数据,就会多出几行。

3.脏读,不可重复读和幻读的演示

前提:mysql肯定要装!!!如下要以终端的形式打开两个窗口,来代表两个事务,还有要修改mysql中的事务隔离级别,演示脏读时,隔离级别改为读未提交(read uncommitted),演示不可重复读时,隔离级别改为读已提交(read committed),演示幻读时,隔离级别修改为可重复读(repeatable read)!
一文搞懂mysql的事务隔离级别_第1张图片

3.1)脏读
3.1.1)查看当前会话的隔离级别,select @@transaction_isolation;
一文搞懂mysql的事务隔离级别_第2张图片

3.1.2)设置两个会话的事务的隔离级均为别为读未提交(read uncommitted)

一文搞懂mysql的事务隔离级别_第3张图片

3.1.3)会话1修改name张三为’zhangsan‘,但是并没有提交,会话2确读到了修改后的数据,但是会话1可能回滚,导致会话2前后两次读到的数据不一致,这样的情况就为脏读
回滚前
一文搞懂mysql的事务隔离级别_第4张图片
回滚后
一文搞懂mysql的事务隔离级别_第5张图片

3.2)不可重复读
3.2.1)设置两个会话的事务隔离级别为read committed
一文搞懂mysql的事务隔离级别_第6张图片

3.2.2)read commited 解决了脏读的现象
一文搞懂mysql的事务隔离级别_第7张图片

3.2.3)解决不了不可重复读的现象,前后两次读取到的数据不一致
一文搞懂mysql的事务隔离级别_第8张图片

3.3)幻读
3.3.1)设置两个会话的事务隔离级别为repeatable read
一文搞懂mysql的事务隔离级别_第9张图片

3.3.2)repeated read可以解决脏读和不可重复读的现象
解决了脏读
一文搞懂mysql的事务隔离级别_第10张图片
解决了不可重复读
一文搞懂mysql的事务隔离级别_第11张图片

3.3.3)但是解决不了幻读的现象
一文搞懂mysql的事务隔离级别_第12张图片

4.四种事务隔离级别介绍

4.1)读未提交(read uncommitted),允许事务读取未被其他事务提交的变更,脏读,重读读,幻读问题都会出现。

4.2)读已提交(read committed),只允许事务读取已经被其他事务提交的变更,可以避免脏读,但是重复读,幻读会出现。

4.3)可重复读(repeatable read),确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新,可以避免脏读,重复读,但是幻读会出现(mysql中默认的事务隔离级别)。

4.4)可串行化(serializable),确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对这个表进行插入,更新,删除操作,所有并发的问题都可以解决,但是性能非常低。

你可能感兴趣的:(mysql,mysql,数据库)