MySQL【事务并发带来的问题与事务隔离机制】

一、前言

MySQL从5.5.8开始,Innodb就是默认的存储引擎,Innodb最大的特点是:支持事务、支持行级锁

既然支持事务,那么就会有处理并发事务带来的问题:

更新丢失、脏读、不可重复读、幻读。

相应的为了解决这四个问题,就产生了事务隔离级别:

读未提交(Read uncommitted),读已提交(Read committed),可重复读(Repeatable read),串行化(Serializable)

二、事务并发带来的问题

在平常的项目开发里数据库操作一般都是并发执行的,即有多个事务并发执行,数据库事务并发带来的问题有:

1、丢失更新:最后的更新覆盖了其他事务之前的更新,而事务之间并不知道,发生更新丢失。

更新丢失,可以完全避免,应用对访问的数据加锁即可。

2、脏读:事务B读取到事务A已经修改但尚未提交的数据。

例如事务A正在访问数据,并且对数据进行了修改,更改了一行数据,这种修改还没有提交到数据库中,而事务B在事务A提交更新之前读取了已更新的行,然后使用了这个数据。
如果事务A回滚该更新,则事务B使用的这个数据由于还没有提交,就会被认为是不曾存在的数据,即为脏数据,根据脏数据所做的操作可能是不正确的。

3、 不可重复读:在同一事务中,两次读取同一数据,得到内容不同,也就是有其他事务更改了这些数据。

指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。

4、幻读:一个事务在执行过程中读取到了另一个事务已提交的插入数据。

即在第一个事务开始时读取到一批数据,但此后另一个事务又插入了新数据并提交,此时第一个事务又读取这批数据但发现多了一条,即好像发生幻觉一样。

脏读:读取到修改但未提交的数据
幻读:读取到新增且已提交的数据

三、事务隔离机制

为了解决上述提到的事务并发问题,数据库提供一定的事务隔离机制来解决这个问题。数据库的事务隔离越严格,并发副作用越小,但付出的代价也就越大,因为事务隔离实质上就是使用事务在一定程度上“串行化” 进行,这显然与“并发” 是矛盾的。

数据库的隔离级别有4个,由低到高依次为Read uncommitted、Read committed、Repeatable read、Serializable。

这四个级别可以逐个解决丢失更新(脏写)、脏读、不可重复读、幻读这几类问题。

备注 : √ 代表可能出现,× 代表不会出现。

MySQL 数据库的默认隔离级别为 Repeatable Read , 查看方式:

show variables like 'tx_isolation';

四、总结

参考文章:Mysql关于事务并发带来的问题

Java新手,若有错误,欢迎指正!

posted @ 2021-02-20 21:08  跑调大叔!  阅读(252)  评论(0编辑  收藏  举报