数据库中对事务的学习

事务


什么是事务

MySQL事务(Transaction)是一种数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务是数据库管理系统中一个非常重要的概念,主要用于处理并发操作时的数据一致性和完整性。

事务的四大特性

  1. 原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不执行,不会结束在中间某个环节。事务在执行过程中发生错误会被回滚(Rollback)到事务开始前的状态,就像这个事务从未执行过一样。
  2. 一致性(Consistency):事务必须使数据库从一个一致性状态变换到另一个一致性状态。一致性与原子性是密切相关的。
  3. 隔离性(Isolation):数据库系统提供一定的隔离机制,使得事务在不受外部并发操作影响的“独立”环境执行。隔离性有四种隔离级别,分别是:读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read,MySQL的默认级别)和串行化(Serializable)。不同的隔离级别可以不同程度地解决并发问题,但也会带来不同的性能开销。
  4. 持久性(Durability):一旦事务被提交,它对数据库的修改就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。

数据库并发性问题

事务隔离级别

事务隔离级别是数据库管理系统(DBMS)用来定义事务之间可见性和并发性的一个标准。SQL标准定义了四种隔离级别,它们解决了脏读、不可重复读和幻读等并发问题:

  1. 读未提交(Read Uncommitted)
    • 最低的隔离级别,允许一个事务读取另一个事务未提交的数据。这可能导致脏读(Dirty Read)。
  2. 读已提交(Read Committed)
    • 保证一个事务不会读取到另一个事务未提交的数据,即避免了脏读。但是,一个事务可能会多次读取同一数据行的不同版本(因为其他事务可能在这两次读取之间提交了更新),导致不可重复读(Nonrepeatable Read)。
  3. 可重复读(Repeatable Read)
    • MySQL的默认事务隔离级别。它确保在同一个事务中多次读取同一数据的结果是一致的,即避免了不可重复读。但是,它并不能完全避免幻读(Phantom Read),即在同一事务中,当两个相同的查询执行时,第二个查询可能会返回第一个查询中未出现的额外行(因为其他事务在这两个查询之间插入了新行)。不过,需要注意的是,在InnoDB存储引擎中,通过多版本并发控制(MVCC)和Next-Key Locks,MySQL的可重复读级别实际上避免了幻读。
  4. 串行化(Serializable)
    • 最高的隔离级别,它通过强制事务串行执行,来避免脏读、不可重复读和幻读。这是通过锁定读取的所有行以及这些行之间的“间隙”来实现的,从而阻止其他事务插入新行。这个级别的性能开销最大。

悲观锁(Pessimistic Locking)

悲观锁是一种数据库并发控制的机制,它假设最坏的情况,即每次操作数据时都假设会有冲突发生,因此每次读取或写入数据时都会先加锁。如果数据被其他事务锁定,则当前事务必须等待,直到锁被释放。悲观锁适用于写操作多于读操作的场景,因为它可以有效避免冲突和数据不一致。

乐观锁(Optimistic Locking)

乐观锁同样是一种数据库并发控制的机制,但它假设最好的情况,即认为在数据处理过程中不会发生冲突,因此只在数据提交更新时检查是否有冲突发生。乐观锁通常通过版本号(Version Number)或时间戳(Timestamp)来实现。每次读取数据时,都会获取当前数据的版本号或时间戳,在更新数据时,检查版本号或时间戳是否发生变化,如果未变化则进行更新(此时会更新版本号或时间戳),如果已变化则说明有其他事务进行了修改,当前事务则需要进行相应的处理(如重试或回滚)。乐观锁适用于读操作远多于写操作的场景,因为它可以减少锁的开销,提高系统的并发能力。

posted @   BingBing爱化学-04044  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示