什么是事务?

为了完成对数据的操作,企业应用经常要求并发访问在多个构件之间共享的数据。这些应用在下列条件下应该维护数据的完整性(由应用的商务规则来定义): 

分布式访问一个单独的数据资源,以及从一个单独的应用构件访问分布式资源。 
在这种情况,可能要求在(分布式)资源上的一组操作被当作一个工作单元(unit)。在一个工作单元中, 操作的所有部分一起成功或失败并恢复。在下面的情况下这个问题更加复杂: 

通过一组分布式的、访问多个资源的数据的构件实现一个工作单元,和/或部分操作是被顺序执行的或在要求协调和/或同步的并行线程中。 

在所有情况下, 都要求应用维护一个工作单元的成功或失败。在失败的情况下,所有资源要把数据状态返回到以前的状态 
(比如说,工作单元开始前的状态)。 
事务的概念和和事务管理器(或者一个事务处理服务)在一个工作单元中的维护数据完整性,这就简化了这样的企业级别分布式应用的构造。

 

一、事务的基本要素(ACID)

 

  1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。

 

   2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。

 

   3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。

 

   4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

 

 

 

二、事务的并发问题

 

  1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据

 

  2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。

 

  3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

 

  小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

 

 

例子说明事务:现在需要将银行理财中的金额转2000到活期账户上去

  1. 检查理财账户中的余额是否高于2000元
  2. 从理财账户的余额减去2000元
  3. 在活期存款账户上增加2000元

 

一个事务是有下列属性的一个工作单元:

原子性(ATOMICITY): 
一个事务要被完全的无二义性的做完或撤消。在任何操作出现一个错误的情况下,构成事务的所有操作的效果必须被撤消,数据应被回滚到以前的状态。 (在例子中可以看出,如果没有事务那么第二步成功第三步还未开始时,就会导致理财账户白白损失2000元,所以在一个事务中事务要么全部成功提交,要么全部失败回滚

 



一致性(CONSISTENCY): 
一个事务应该保护所有定义在数据上的不变的属性(例如完整性约束)。在完成了一个成功的事务时,数据应处于一致的状态。换句话说,一个事务应该把系统从一个一致-状态转换到另一个一致状态。举个例子,在关系数据库的情况下, 
一个一致的事务将保护定义在数据上的所有完整性约束。(在例子中我们可以看出理财账户和活期账户的总金额没有发生变化,事务的一致性指的是数据的完整性不应随着状态而变化,即不管转账多少次理财账户和活期账户的总金额不变

 



隔离性(ISOLATION): 
在同一个环境中可能有多个事务并发执行,而每个事务都应表现为独立执行。串行的执行一系列事务的效果应该同于并发的执行它们。这要求两件事: 

在一个事务执行过程中,数据的中间的(可能不一致)状态不应该被暴露给所有的其他事务。 
两个并发的事务应该不能操作同一项数据。数据库管理系统通常使用锁来实现这个特征。 (在例子中这个事务还没有提交的时候,查询A用户余额应该看到的还是转账前的余额,后面会讲到事务的几种隔离级别)

 


持久性(DURABILITY): 
一个被完成的事务的效果应该是持久的,是一个相对而言的概念,只从数据库角度考虑,而不包括磁盘损坏等情况(磁盘损坏需要通过磁盘数据备份或者高可用架构等完成)

 

 

事务的隔离级别

事务隔离级别      
       
       
       
       

转载于:https://www.cnblogs.com/JavaHxm/p/10915167.html

Logo

更多推荐