数据库中对事务的学习
事务
什么是事务
MySQL事务(Transaction)是一种数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务是数据库管理系统中一个非常重要的概念,主要用于处理并发操作时的数据一致性和完整性。
事务的四大特性
- 原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不执行,不会结束在中间某个环节。事务在执行过程中发生错误会被回滚(Rollback)到事务开始前的状态,就像这个事务从未执行过一样。
- 一致性(Consistency):事务必须使数据库从一个一致性状态变换到另一个一致性状态。一致性与原子性是密切相关的。
- 隔离性(Isolation):数据库系统提供一定的隔离机制,使得事务在不受外部并发操作影响的“独立”环境执行。隔离性有四种隔离级别,分别是:读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read,MySQL的默认级别)和串行化(Serializable)。不同的隔离级别可以不同程度地解决并发问题,但也会带来不同的性能开销。
- 持久性(Durability):一旦事务被提交,它对数据库的修改就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。
数据库并发性问题
事务隔离级别
事务隔离级别是数据库管理系统(DBMS)用来定义事务之间可见性和并发性的一个标准。SQL标准定义了四种隔离级别,它们解决了脏读、不可重复读和幻读等并发问题:
- 读未提交(Read Uncommitted)
- 最低的隔离级别,允许一个事务读取另一个事务未提交的数据。这可能导致脏读(Dirty Read)。
- 读已提交(Read Committed)
- 保证一个事务不会读取到另一个事务未提交的数据,即避免了脏读。但是,一个事务可能会多次读取同一数据行的不同版本(因为其他事务可能在这两次读取之间提交了更新),导致不可重复读(Nonrepeatable Read)。
- 可重复读(Repeatable Read)
- MySQL的默认事务隔离级别。它确保在同一个事务中多次读取同一数据的结果是一致的,即避免了不可重复读。但是,它并不能完全避免幻读(Phantom Read),即在同一事务中,当两个相同的查询执行时,第二个查询可能会返回第一个查询中未出现的额外行(因为其他事务在这两个查询之间插入了新行)。不过,需要注意的是,在InnoDB存储引擎中,通过多版本并发控制(MVCC)和Next-Key Locks,MySQL的可重复读级别实际上避免了幻读。
- 串行化(Serializable)
- 最高的隔离级别,它通过强制事务串行执行,来避免脏读、不可重复读和幻读。这是通过锁定读取的所有行以及这些行之间的“间隙”来实现的,从而阻止其他事务插入新行。这个级别的性能开销最大。
悲观锁(Pessimistic Locking)
悲观锁是一种数据库并发控制的机制,它假设最坏的情况,即每次操作数据时都假设会有冲突发生,因此每次读取或写入数据时都会先加锁。如果数据被其他事务锁定,则当前事务必须等待,直到锁被释放。悲观锁适用于写操作多于读操作的场景,因为它可以有效避免冲突和数据不一致。
乐观锁(Optimistic Locking)
乐观锁同样是一种数据库并发控制的机制,但它假设最好的情况,即认为在数据处理过程中不会发生冲突,因此只在数据提交更新时检查是否有冲突发生。乐观锁通常通过版本号(Version Number)或时间戳(Timestamp)来实现。每次读取数据时,都会获取当前数据的版本号或时间戳,在更新数据时,检查版本号或时间戳是否发生变化,如果未变化则进行更新(此时会更新版本号或时间戳),如果已变化则说明有其他事务进行了修改,当前事务则需要进行相应的处理(如重试或回滚)。乐观锁适用于读操作远多于写操作的场景,因为它可以减少锁的开销,提高系统的并发能力。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?