论述题 17.  数据库中“事务处理”指的是什么?
【正确答案】事务是数据库中一个单独的执行单元(Unit),它通常由高级数据库操作语言(例如SQL)或编程语言(例如C++、Java等)编写的用户程序的执行所引起。当在数据库中更改数据成功时,在事务中更改的数据便会提交,不再改变。否则,事务就取消或者回滚,更改无效。
   例如网上购物,其交易过程至少包括以下几个步骤的操作:
   1)更新客户所购商品的库存信息。
   2)保存客户付款信息。
   3)生成订单并且保存到数据库中。
   4)更新用户相关信息,例如购物数量等。
   在正常的情况下,这些操作都将顺利进行,最终交易成功,与交易相关的所有数据库信息也成功地更新。但是,如果在执行的中途遇到突然掉电或者其他意外情况,导致这一系列过程中任何一个环节出了差错,例如在更新商品库存信息时发生异常、顾客银行账户余额不足等,都将导致整个交易过程失败。而一旦交易失败,数据库中所有信息都必须保持交易前的状态不变,例如最后一步更新用户信息时失败而导致交易失败,那么必须保证这笔失败的交易不影响数据库的状态,即原有的库存信息没有被更新、用户也没有付款、订单也没有生成。否则,数据库的信息将会不一致,或者出现更为严重的不可预测的后果,数据库事务正是用来保证这种情况下交易的平稳性和可预测性的技术。
   事务必须满足四个属性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),即ACID四种属性。以下将分别对这四种特性进行介绍。
   (1)原子性
   事务是一个不可分割的整体,为了保证事务的总体目标,事务必须具有原子性,即当数据修改时,要么全都执行,要么全都不执行,即不允许事务部分地完成,避免了只执行这些操作的一部分而带来的错误。
   (2)一致性
   一个事务在执行之前和执行之后,数据库数据必须保持一致性状态。数据库的一致性状态应该满足模式锁指定的约束,那么在完整执行该事务后,数据库仍然处于一致性状态。为了维护所有数据的完整性,在关系型数据库中,所有的规则必须应用到事务的修改上。数据库的一致性状态由用户来负责,由并发控制机制实现,例如银行转账,转账前后两个账户金额之和应保持不变。由于并发操作带来的数据不一致性通常包括以下几种类型:丢失数据修改、读“脏”数据、不可重复读和产生幽灵数据。
   (3)隔离性
   也被称为独立性,当两个或多个事务并发执行时,为了保证数据的安全性,将一个事务内部的操作隔离起来,不被其他的正在进行的事务看到。例如对任何一对事务T1和T2,对T1而言,T2要么在T1开始之前已经结束,要么在T1完成之后再开始执行。数据库有四种类型的事务隔离级别:不提交的读、提交的读、可重复的读和串行化。因为隔离性使得每个事务的更新在它被提交之前,对其他事务都是不可见的,所以,实施隔离性是解决临时更新与消除级联回滚问题的一种方式。
   (4)持久性
   也被称为永久性,事务完成以后,DBMS保证它对数据库中数据的修改是永久性的,当系统或介质发生故障时,该修改也永久保持。持久性一般通过数据库备份与恢复来保证。
   严格而言,数据库事务属性都是由数据库管理系统来进行保证的,在整个应用程序的运行过程中,应用程序无须去考虑数据库的ACID实现。
   一般情况下,通过执行COMMIT(提交)或ROLLBACK(回滚)语句来终止事务。当执行COMMIT语句时,自从事务启动以来对数据库所做的一切更改就成为永久性的,即被写入到磁盘,而当执行ROLLBACK语句时,自从事务启动以来对数据库所做的一切更改都会被撤销,并且数据库中内容返回到事务开始之前所处的状态。无论什么情况,在事务完成时,都能保证回到一致状态。
【答案解析】