数据库事务

1. 数据库事务定义

 数据库事务(Database Transaction),是指作为单个逻辑工作单元执行的一系列操作,要么完全的执行,要么完全的不执行。

 事务是数据库运行中的逻辑工作单位,由DBMS中的事务管理子系统来负责事务的处理。

 理解:当一个事务被提交给DBMS (数据库管理系统),则DBMS需要确保该事务中的所有操作都成功完成,且其结果都被永久保存在数据库中。如果事务中有的操作没有成功完成,则事务中的所有操作都需要被回滚,回到事务执行前的状态 (要么全部执行,要么全部不执行) ;同时,该事务对数据或者其他事务的执行没有任何影响,所以事务都好像在独立运行。

      但是在现实情况中,操作失败的风险很高。在一个数据事务的执行过程中,有可能会遇到事务操作失败、数据库系统或操作系统失败,甚至是存储介质指失败等情况。这就需要DBMS对一个执行失败的事务执行恢复操作,将其数据库状态恢复到一致状态 (数据的一致性得到保证的状态)。为了实现将数据库状态恢复到一致状态的功能,DBMS通常需要维护事务日志以追踪事务中所有影响数据库数据的操作。

2. 使用事务的优势

 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。

 通过将一组相关操作组合为一个要么全部成功,要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。

 从应用程序的角度来讲,事务的提出就是为了解决并发情况下保持数据一致性的问题。

 从数据库的角度来讲,事务是数据库维护数据一致性的单元,在每个事务结束时,都能保证数据的一致性。

3. 一个逻辑单元要成为事务,必须满足事务的四大特性,即ACID属性;包括:原子性、一致性、隔离性、持久性。

4. 数据库事务的应用场景

 简单来说,在对数据库中数据进行任何DML操作的时候都需要使用事务,即在对数据表进行insert、update、delete、query操作时,为了保证数据的完整性和一致性都需要用到数据库事务。

5. 事务的ACID属性

(1) 原子性 ( Atomic / Atomicity ):事务必须是原子工作单元;对于其数据修改,要的全部都执行,要么全部都不执行。

      通常,与某个事务关联的操作具有共同的目标,并且是相互依赖的。如果系统只执行这些操作的一个子集,则可能会破坏事务的总体目标。原子性消除了系统处理操作子集的可能性。

(2) 一致性 ( Consistent / Consistency ):事务在完成时,必须使所有的数据都保持一致状态。

     在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构都必须是正确的。某些维护一致性的责任由应用程序开发人员承担,他们必须保证应用程序已强制所有已知的完整性约束。例如,在开发用于转账业务的应用程序时,应避免在转账过程中任意移动小数点。

(3) 隔离性 ( Insulation / Isolation ):由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务查看数据时,数据所处的状态要么是另一个并发事务修改之前的状态,要么是另一个事务修改它之后的状态,事务不会查看中间状态的数据,称之为事务的隔离性。因为它能够重新装载起始数据,并且重播一系列事务,以数据结束时的状态与原始事务执行的状态相同。由于高度隔离会限制可并行执行的事务数,所以一些应用程序降低隔离级别以换取更大的吞吐量。

(4) 持久性 ( Duration / Durability ):事务完成后,它对系统的影响是永久性的。该修改即使出现致命的系统故障也将一直保持。

6. 事务处理模式

事务处理有以下三种模式:

(1) 隐式事务:指每一条数据操作语句都自动地成为一个事务,事务的开始是隐式的,事务的结束有明确的标记。

(2) 显式事务:指有显式的开始和结束标记的事务,每个事务都有显式的开始和结束标记。

(3) 自动事务:是系统自动默认的,开始和结束不用标记。

7. 并发控制

(1) 数据库系统一个明显的特点是多个用户共享数据库资源,尤其是多个用户可以同时存取相同数据。

      串行控制:如果事务是顺序执行的,即一个事务完成之后,再开始另一个事务;

      并行控制:如果DBMS可以同时接受多个事务,并且这些事务在时间上可以重叠执行。

(2) 并发控制概述:

      事务是并发控制的基本单位,保证事务ACID的特性是事务处理的重要任务,而并发操作有可能会破坏其ACID特性。

      DBMS并发控制机制的责任:

      对并发操作进行正确的调度,保证事务的隔离性更一般,确保数据库的一致性。

      如果没有锁定且多个用户同时访问一个数据库,则当他们的事务同时使用相同的数据时可能会发生问题。由于并发操作带来的数据不一致性包括:修饰数据修改、读"脏"数据(脏读)、不可重复度、产生幽灵数据。

      ① 丢失数据修改

        当两个或者多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题。每个事务都不知道其他事务的存在,最后保存其更改复本的编辑人员覆盖了第一个编辑人员所做的更改。如果在第一个编辑人员完成之后,第二个编辑人员才能进行更改,则可以避免该问题。

       ② 读"脏"数据(脏读)

        读"脏"数据是指事务T1修改某一数据,并将其写回磁盘,事务T2读取同一数据后,T1由于某种原因被撤销,而此时T1把已修改过的数据又恢复原值,T2读取到的数据与数据库的数据不一致,则T2读到的数据就为 “脏读” 数据,即,不正确的数据。

        例如,一个编辑人员正在更改电子文档,在更改过程中,另一个编辑人员复制了此文档 (该复本包含到目前为止所做的全部更改 )并将其分发给预期的用户。此后,第一个编辑人员认为所作的更改是错误的,于是删除了所作的编辑,并保存了文档。那么,分发给用户的文档包含了不再存在的编辑内容,并且这些编辑内容应认为从未存在过。如果第一个编辑人员确定是最终更改前,任何人都不能读取更改的文档,则可以避免出现该问题。

       ③ 不可重复读

        不可重复读是指,事务T1读取数据后,事务T2执行更新操作,使T1无法读取前一次结果。不可重复读包括了三种情况:

         事务T1读取某一数据后,T2对其作了修改,当T1再次读该数据后,得到与前一次不同的值。

       ④ 产生幽灵数据

         按一定条件从数据库中读取了某一些记录后,T2删除了其中部分记录,当T1再次按相同条件读取数据时,发现某些记录消失。T1按一定条件从数据库中删除某些数据记录后,T2插入了一些记录,当T1再次按相同条件读取数据时,发现多了一些记录。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值