1.所谓脏写,就是我刚才明明写了一个数据值,结果过了一会却没了。
而它的本质就是事务 B 去修改了事务 A 修改过的值,但是此时事
务 A 还没提交,所以事务 A 随时会回滚,导致事务 B 修改的值
也没了,这就是脏写的定义。
2.脏读,它的本质是事务 B 去查询了事务 A 修改过的数据,但是此时
事务 A 还没提交,所以事务 A 随时会回滚导致事务 B 再次查询就读
不到刚才事务 A 修改的数据了,这就是脏读。
**总结:**无论是脏写还是脏读,都是因为一个事务去更新或者查询了另外一个还没提交的事务更新过的数据。因为另外一个事务还没提交,所以它随时可能会回滚,那么必然导致你更新的数据就没了,或者你之前查询到的数据就没了,这就是脏写和脏读两种场景
3.不可重复读:如果你期望的是可重复读,但是数据库表现的是不可重复读,让你事务 A 执行期间多次查到的值都不一样,读的问题是别的提交过的事务修改过的,那么此时你就可以认为,数据库有问题,这个问题就是「不可重复读」
脏写、脏读和不可重复读都分别代表了不同的数据库问题。脏写就是两个事务没提交的状况下,都修改同一条数据,结果一个事务回滚了,把另外一个事务修改的值也撤销了,所谓脏写就是两个事务没提交状态下修改同一个值。
脏读就是一个事务修改了一条数据的值,结果还没提交呢,另外一个事务就读到了你修改的值,然后你回滚了,人家事务再次读,就读不到了,即人家事务读到了你修改之后还没提交的值,这就是脏读了。而不可重复读,针对的是已经提交的事务修改的值,被你事务给读到了,你事务内多次查询,多次读到的是别的已经提交的事务修改过的值,这就导致不可重复读。
4.幻读:你一个事务 A,先发送一条 SQL 语句,里面有一个条件,要查询一批数据出来,如 SELECT * FROM table WHERE id > 10。然后呢,它一开始查询出来了 10 条数据。接着这个时候,别的事务 B往表里插了几条数据,而且事务 B 还提交了,此时多了几行数据。你开始怀疑的你眼睛以为产生了幻觉,这就是幻读的由来。
mysql
最新推荐文章于 2024-06-14 11:48:54 发布