当前位置:   article > 正文

Mysql的事务并发问题和解决办法_mysql事务并发问题

mysql事务并发问题

1. 脏读

含义:在事务过程中,读到了其它事务未提交的数据。

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

简答来说,读取了其他事务未提交的数据

解决方法:将数据库事务提升到提交读或以上的隔离级别

2. 不可重复读

含义:一次事务中,两次读操作中,读出来的数据内容不一致。

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

解决方法:将数据库事务提升到可重复读或以上的隔离级别。

3. 幻读

含义:一次事务中,两次读操作中,读到的数据行数不一致。读到了新增或者读不到删除的语句。

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

解决方法:将数据库事务提升到序列化(串行化)或以上的隔离级别。

注:幻读和不可重复读很像但有区别。幻读是事务1操作过程中,有新数据添加提交了。再读时会出现新数据。不可重复读是,事务1操作过程中,之前读过的数据被修改或删除了。

4. 丢失修改(脏写)

含义:多个事务同时对数据进行修改,其中一个事务的数据被另一个事务的操作覆盖,导致丢失修改。如果一个事务修改了另一个未提交事务修改过的数据,那就意味着发生了 脏写

解决:脏写这个问题太严重了,不论是哪种隔离级别,都不允许脏 写的情况发生。

四种隔离级别:

READ UNCOMMTTED(未提交读)

一个事务在执行过程中可以看到其他事务没有提交的新插入的记录,而 且能看到其他事务没有提交的对已有记录的更新。

READ COMMITED(已提交读)

一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,而且能看到其他事务已经提交的对已有记录的更新。

REPEATABLE READ(可重复读,默认)

一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,但是不能看到其他其他事务对已有记录的更新。

SERIALIZABLE(串行化)

一个事务在执行过程中完全看不到其他事务对数据库所做的更新。(事务执行的时候不允许别的事务并发执行。事务串行化执行,事务只能一个接着一个地执行,而不能并发执行)

解决方法:在写写环境下,MySQL会通过锁来保证并发修改的正常。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/766641
推荐阅读
相关标签
  

闽ICP备14008679号