数据库的脏读,幻读,不可重复读

参考:https://www.cnblogs.com/cdlyy/p/11067658.html

1.脏读

指一个事务A正在访问数据,并且对该数据进行了修改,但是这种修改还没有提交到数据库中(也可能因为某些原因Rollback了)。这时候另外一个事务B也访问这个数据,然后使用了这个被A修改的数据,那么这个数据就是脏的,并不是数据库中真实的数据。这就被称作脏读。

2.幻读

指一个事务A对一个表中的数据进行了修改,而且该修改涉及到表中所有的数据行;同时另一个事务B也在修改表中的数据,该修改是向表中插入一行新数据。那么经过这样一番操作后,操作事务A的用户就会发现表中还有没修改的数据行,就像发生了幻觉一样。这就被称作幻读。

3.不可重复读

指在一个事务A内,多次读同一个数据,但是事务A没有结束时,另外一个事务B也访问该同一数据。那么在事务A的两次读数据之间,由于事务B的修改导致事务A两次读到的数据可能是不一样的。这就发生了在一个事务内两次读到的数据不一样,这就被称作不可重复读。

### 当一个事务能够取到另一个尚未提交的事务所修改的数据时,即发生了。这种情况下,如果后续该未提交的事务被回滚,则第一个事务实际上到了从未实际存在的数据状态。 为了避免这种情况,在较高的隔离级别下,如`READ COMMITTED`及以上,数据库会阻止任何事务取其他事务未提交的变化[^1]。 ```sql -- 设置事务隔离级别为 READ COMMITTED 来防止 SET TRANSACTION ISOLATION LEVEL READ COMMITTED; ``` ### 不可重复 不可重复指的是在一个事务内多次查询同一记录集得到的结果不一致的现象。这通常是因为在两次查询之间有其他的已提交事务对该数据进行了更新操作所致。 通过设置更高的隔离等级至`REPEATABLE READ`可以有效避免此类问题的发生。在此模式下,一旦某个事务开始访问某些行之后直到结束之前,这些行上的锁定将持续保持不变,从而确保在整个过程中看到相同版本的数据[^2]。 ```sql -- 使用 REPEATABLE READ 隔离级来保障在同一事务内的查询结果的一致性 SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; ``` ### 涉及的是范围条件检索而非单条记录的操作。具体表现为同一个事务中前后两次相同的查询返回不同的集合大小或内容变化——即使在这期间并没有直接更改过具体的某一行而是新增加或者删除了一些符合条件的新旧记录而已。 对于MySQL而言,默认采用的InnoDB存储引擎提供了两种方式处理这个问题: - **Next-Key Locks**: 这种类型的锁不仅覆盖索引项本身还包括其前驱节点之间的区间部分;因此能很好地预防新插入的数据造成的影响。 - **Serializable**:这是最严格的隔离层次,它强制所有对表的选择都转化为显式的共享/排他锁请求形式完成,进而完全杜绝任何形式下的并发冲突可能性[^4]. ```sql -- 将隔离度设为 SERIALIZABLE 可彻底消除影现象 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值