mysql的事务隔离级别

Posted 健康平安的活着

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql的事务隔离级别相关的知识,希望对你有一定的参考价值。

一 事务

1.1 事务

事务代表(一组操作,可以是SQL语句或者代码),如果其中一个操作不成功,这些操作都不会执行,前面执行的操作也会回滚原状态,用来保证数据的一致性和完整性。

  • 事务的提交是指事务里的所有操作都正常完成。

  • 事务的回滚是指程序或数据处理错误,将程序或数据恢复到上一次正确状态的行为

1.2 事务的ACID属性

原子性(atomicity)
要么都成功,要么都失败

一致性(consistency)
事物前后的数据完整性要保证一致
比如开始1000块钱,后面转账结束了,也得是1000块钱。

持久性(durability)
事物一旦提交则不可逆,被持久化到数据库中。

隔离性(isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,
不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离

1.3 并发事务带来的问题

  • 脏读:
    指一个事务读取了另外一个事务未提交的数据。

  • 不可重复读:
    在一个事务内读取表中的某一行数据,多次读取结果不同。(这个不一定是错误,只是某些场合不对)

  • 虚读(幻读)
    是指在一个事务内读取到了别的事务插入的数据,导致前后读取数量总量不一致

1.脏读(Dirty Reads)

一个事务正在对一条记录做修改,在这个事务完成并提交前,这条记录的数据就处于不一致状态;这时,另一个事务也来读取同一条记录,如果不加控制,第二个事务读取了这些“脏”数据,并据此做进一步的处理,就会产生未提交的数据依赖关系。这种现象被形象地叫做”脏读”。

一句话:事务A读取到了事务B已修改但尚未提交的的数据,还在这个数据基础上做了操作。此时,如果B事务回滚,A读取的数据无效,不符合一致性要求。

2.不可重复读(Non-Repeatable Reads)

一个事务在读取某些数据后的某个时间,再次读取以前读过的数据,却发现其读出的数据已经发生了改变、或某些记录已经被删除了!这种现象就叫做“不可重复读”。

一句话:事务A读取到了事务B已经提交的修改数据,不符合隔离性。

3.幻读(Phantom Reads)

一个事务接相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为“幻读“。

一句话:事务A读取到了事务B体提交的新增数据,不符合隔离性。

幻读和脏读有点类似,

脏读是事务B里面修改了数据,

幻读是事务B里面新增了数据。

注意不可重复读和虚度的区别:

不可重复读是同一个事务的多次读取而导致信息不一致
虚度是读取到了其他人的信息而导致信息不一致

总结:

  • 脏读是事务B里面修改了但未提交的数据,,A读取到了
  • 不可重复读是事务B里面修改了但提交了的数据,A读取到了
  • 幻读是事务B里面新增了但已经提交的数据。,A读取到了

1.4  事务的隔离级别

数据库的事务隔离越严格,并发副作用越小,但付出的代价也就越大,因为事务隔离实质上就是使事务在一定程度上“串行化”进行,这显然与“并发”是矛盾的。同时,不同的应用对读一致性和事务隔离程度的要求也是不同的,比如许多应用对“不可重复读”和“幻读”并不敏感,可能更关心数据并发访问的能力。

常看当前数据库的事务隔离级别:show variables like 'tx_isolation';
系统默认是可重复读
如上表格,可重复读解决了脏读和可重复读的问题,而一般又采用了MVVC多版本并发控制来解决幻读的问题,所以在效率和ACID综合考虑下是相对较好的一个隔离级别选择。

1.5 事务的常见术语

关于事务的四个基本术语

开启事务(Start Transaction)
事务结束(End Transaction)
提交事务(Commit Transaction)
回滚事务(Rollback Transaction)
关于事务的类型

显示事务
手动提交或回滚;
DML语言所有的操作都是显示事务;

隐式事务
数据库自动提交,同时不具备回滚性;
DDL、DCL语言都是隐式事务操作
https://blog.csdn.net/weixin_47872288/article/details/121491730

 

以上是关于mysql的事务隔离级别的主要内容,如果未能解决你的问题,请参考以下文章

MySQL的事务隔离级别

深入了解MySQL的隔离级别和锁机制

MySQL事务的隔离级别

MySQL的默认事务隔离级别是?

MySql事务隔离级别

mysql事务的隔离级别