什么是事务?以及并发事务带来的相关问题

事务的定义

事务是由一组SQL语句组成的逻辑处理单元,事务具有以下4个属性,通常简称为事务的ACID属性。

经典案例

事务最经典也经常被拿出来说例⼦就是转账了。假如⼩明要给⼩红转账1000元,这个转账会涉及 到两个关键操作就是:将⼩明的余额减少1000元,将⼩红的余额增加1000元。万⼀在这两个操 作之间突然出现错误⽐如银⾏系统崩溃,导致⼩明余额减少⽽⼩红的余额没有增加,这样就不对 了。事务就是保证这两个关键操作要么都成功,要么都要失败。

事物的四⼤特性(ACID)

  1. 原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。
  2. 一致性:(Consistent):在事务开始和完成时,数据都必须保持一致状态,这意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性;事务结束时,所有的内部数据结构(如B树索引或双向链表)也都必须是正确的。
  3. 隔离性(Isolation):数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行。这意味着事务处理过程中的中间状态对外部是不可见的,反之亦然。
  4. 持久性(Durable):事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。

并发事务带来的四大问题

在典型的应⽤程序中,多个事务并发运⾏,经常会操作相同的数据来完成各⾃的任务(多个⽤户 对同⼀数据进⾏操作)。并发虽然是必须的,但可能会导致以下的问题

  • 脏读(Dirty Reads)当⼀个事务正在访问数据并且对数据进⾏了修改,⽽这种修改还没有提 交到数据库中,这时另外⼀个事务也访问了这个数据,然后使⽤了这个数据。因为这个数据 是还没有提交的数据,那么另外⼀个事务读到的这个数据是“脏数据”,依据“脏数据”所做的 操作可能是不正确的。
  • 更新丢失(Lost Update):: 指在⼀个事务读取⼀个数据时,另外⼀个事务也访问了该数据,那么在第⼀个事务中修改了这个数据后,第⼆个事务也修改了这个数据。这样第⼀个事 务内的修改结果就被丢失,因此称为丢失修改。 例如:事务1读取某表中的数据A=20,事 务2也读取A=20,事务1修改A=A-1,事务2也修改A=A-1,最终结果A=19,事务1的修改被丢失。
  • 不可重复读(Non-Repeatable Reads):一个事务在读取某些数据后的某个时间,再次读取以前读过的数据,却发现其读取出的数据已经发生了改变,或某些记录已经被删除了!这种现象叫做“不可重复读”。一句话:事务A读取到了事务B已经提交的修改数据,不符合隔离性。
  • 幻读(Phantom):幻读与不可重复读类似。它发⽣在⼀个事务(T1)读取了⼏⾏数 据,接着另⼀个并发事务(T2)插⼊了⼀些数据时。在随后的查询中,第⼀个事务(T1) 就会发现多了⼀些原本不存在的记录,就好像发⽣了幻觉⼀样,所以称为幻读。
posted @ 2021-07-08 09:33  没有你哪有我  阅读(414)  评论(0编辑  收藏  举报