事务及隔离机制

本文详细阐述了数据库事务中的脏读、不可重复读和幻读现象,并介绍了四种事务隔离级别:读未提交、读已提交、可重复读和序列化,通过示例展示了不同隔离级别下的行为,旨在帮助理解事务处理中的数据一致性问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

脏读: 当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。

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

幻读:第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。(对数据的插入与删除)

  • 可重复读会导致出现幻读,但如果使用普通的读,会得到一直性的结果。如果使用了加锁的读,就会读到最新的提交结果 

 

数据库事务隔离级别

  •   Read UnCommitted(读未提交):最低的隔离级别。一个事务可以读取另一个事务并未提交的更新结果。

  • Read Committed(读提交):一个事务的更新操作结果只有在该事务提交之后,另一个事务才可以的读取到同一笔数据更新后的结果。

  • Repeatable Read(重复读):mysql的默认级别。整个事务过程中,对同一笔数据的读取结果是相同的,不管其他事务是否在对共享数据进行更新,也不管更新提交与否。

  •  Serializable(序列化):最高隔离级别。所有事务操作依次顺序执行。注意这会导致并发度下降,性能最差。通常会用其他并发级别加上相应的并发锁机制来取代它。该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。

 

 

示例

数据库表users的基本信息

 

以读未提交(read-uncommitted)举例,其他同理

 出现了脏读,session2的第五步读取了session1还未提交的数据,当session1回滚时,此时session读的的数据是无效的。

 

参考文献

1.MySQL 四种事务隔离级的说明

2.MySQL事务隔离级别测试实例

3.数据库事务隔离级别 - 分析脏读 & 不可重复读 & 幻读

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值