Mysql性能调优与架构设计-4

本文详细介绍了数据库事务的ACID特性及其并发问题,包括脏读、不可重复读和幻读等,并深入探讨了不同隔离级别的解决方案及MySQL如何利用MVCC机制实现可重复读。

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

数据库事务

事务特性(ACID)

  • 原子性:事务不可分割,要么全部成功,要么全部失败。
  • 一致性:表示数据状态不会变。
  • 隔离性:事物之间需要隔离机制。
  • 持久性:事务的提交必须永久保存数据库。

事务并发引起的问题

  • 脏读:事务读到未提交的数据。
  • 不可重复读:事务中两次读取到的数据被修改。
  • 幻读:事务中两次读取到的之前不存在的数据。

事务隔离级别

  • 读未提交
  • 读已提交
    Mysql实现方式:使用MVCC,在一个事务中每次查询(快照读)数据前都会生成一个ReadView表,记录的有当前所有活跃的事务,和当前最小和最大事务id+1。通过版本链直到读取的数据版本不在活跃事务中且小于最小活跃事务id。
  • 可重复读:mysql中默认级别,部分解决了幻读。
    Mysql实现方式:使用MVCC,在一个事务中仅第一次查询(快照读)数据前生成一个ReadView表,记录的有当前所有活跃的事务,和当前最小和最大事务id。通过版本链直到读取的数据版本不在活跃事务中且小于最小活跃事务id。

此时可以发现,mysql使用该级别可以解决大部分幻读问题。
但是如果一个事务在两次查询期间操作数据,可能会导致两次查询出现幻读情况。

  • 可串行化

MVCC

版本链

数据库表每条修改记录都有事务id和指针,指向上一个版本undolog日志记录。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值