Fork me on GitHub

事务的的四大特性

事务的定义

数据库事务(事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。

事务的四大特性—ACID

  • 原子性(Atomicity):事务包含的操作全部成功或者全部失败
  • 一致性(Consistency):是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
  • 隔离性(Isolation): 隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
  • 持久性(Durability):是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

以A给B转账1000元为例子:

  • 如何同时保证上述交易中,A账户总金额减少1000,B账户-总金额增加1000? A
  • A账户如果同时在和C账户交易(T2),如何让这两笔交易互不影响? I
  • 如果交易完成时数据库突然崩溃,如何保证交易数据成功保存在数据库中? D
  • 如何在支持大量交易的同时,保证数据的合法性(没有钱凭空产生或消失) ? C

一致性是基础,也是最终目的,其他三个特性(原子性、隔离性和持久性)都是为了保证一致性的

原子性和一致性

事务中的操作必须作为一个整体,全部进行,或者一起回滚.就像原子最为物质的最小单位一样,无法再细分下去.
比如:A给B转账,那么A-100和B+100必须全部进行.

但是,保证原子性的情况下是否就能满足一致性?答案是:否

例如,事务1需要将100元转入帐号A:先读取帐号A的值,然后在这个值上加上100。但是,在这两个操作之间,另一个事务2修改了帐号A的值,为它增加了100元。那么最后的结果应该是A增加了200元。但事实上,
事务1最终完成后,帐号A只增加了100元,因为事务2的修改结果被事务1覆盖掉了。
问题根源在于没有满足隔离性

支持一下^-^
0%