事物隔离级别

> 事物隔离级别

MySQL中的事务隔离级别一共有4种:

1. 读未提交(Read Uncommitted)  

  最低隔离级别,事务可以读取到别的事务尚未提交的修改。可能会导致脏读、不可重复读和幻读。

2. 读已提交(Read Committed)

  解决脏读,保证读取到的数据均已提交。可能导致不可重复读和幻读。

3. 可重复读(Repeatable Read)

  解决脏读和不可重复读,保证多次读取的数据一致。可能导致幻读。是MySQL的默认隔离级别。  

4. 串行化(Serializable) 

   最高隔离级别,事物依次执行,避免上述所有问题,但性能较低。 

MySQL服务器对4个事务隔离级别的实现都不完全满足严格意义上的事务原则,都是在一定程度上“松散”的实现。

开发中需要根据业务场景选择合适的隔离级别,在性能和一致性中权衡。

 

不可重复读(Non-Repeatable Read)是数据库事务的一个问题,它发生在以下情况:

1. 一个事务在同一查询中,第一次读取某条记录。

2. 与此同时,另一个事务对该记录进行了更新。

3. 然后第一个事务再次读取同一记录,发现值已被修改。

比如事务1读取了库存值为10的产品记录,这时事务2更新了该产品记录,将库存改为了8。然后事务1再次读取同一产品时,库存值变成了8,导致两个查询返回了不同结果。

这就是不可重复读。它会导致一个事务中同样的查询,返回了不同数据。

原因在于两个事务隔离性不够,正在操作同一记录而相互干扰。这会影响一致性。

在MySQL中,默认的REPEATABLE READ隔离级别可以避免这种情况,它会通过行锁保证同一事务中多次读取数据一致。

 

幻读(Phantom Read) 是数据库事务隔离级别的一个问题,它发生在以下情况:

1. 一个事务(T1)读取了某范围的数据集后。

2. 另一个并发事务(T2)在第一个事务结束之前插入了新的数据到该数据集范围中。

3. 当第一个事务(T1)再次读取同一数据集范围的时候,发现多了新插入的数据,就好像发生了幻觉一样。

比如T1根据条件查询库存表,读到结果有10行记录。这时T2插入了一条匹配查询条件的新记录。当T1再次查询时,结果就变成了11行,好像“新生”了一条数据,这就是幻读。

幻读与不可重复读不同的地方在于,不可重复读是更新改变了某一行,而幻读是有新的行“凭空”增加了。

在MySQL中,幻读现象是可能发生的,需要应用使用加锁来避免。提升隔离级别为可串行化(Serializable)也可以解决这个问题。

 

可重复读(Repeatable Read)是数据库事务的一个隔离级别。 

它的意思是在同一个事务中,多次读取同一个数据总是返回相同结果,即之前读取过的数据在事务结束前不能被其他事务修改,具有可重复读的特征。

在这种隔离级别下,可以避免以下情况:

1. 脏读:一个事务读取到另一个事务还未提交的变更。 

2. 不可重复读:一个事务中多次读取的数据结果不一致。

但仍然可能出现幻读的问题,即一个事务提交之前,其他事务插入了新的数据。

在MySQL中,默认采用的隔离级别就是REPEATABLE READ,即可重复读。它通过行锁机制防止同一行数据被其他事务修改,从而保证了在当前事务中可以重复读取到相同结果。 

这为应用提供了良好的一致性,但有可能因为行锁造成并发性能损耗。

posted on 2024-02-27 13:32  滚动的蛋  阅读(3)  评论(0编辑  收藏  举报

导航