6-1-2

来源:百度文库 编辑:神马文学网 时间:2024/04/28 08:48:05


6.1.1 事务的定义
1.事务概念的引出
   从用户观点看,对数据库的某些操作应是一个整体,也就是一个独立的工作单元,不能分割。
   譬如,客户认为电子资金转账(从账号A转一笔款子到账号B)是一个独立的操作,而在DBS中这是由几个操作组成的。显然,这些操作要么全都发生,要么由于出错(可能账号A已透支)而全不发生。
   保证这一点非常重要,我们决不允许发生下面的事情:在账号A透支情况下继续转账;或者从账号A转出了一笔钱,因不知去向而未能转入账号B中。这样就引出了事务的概念。

2.事务的定义
事务(transaction): 是构成单一逻辑工作单元的操作集合,要么完整地执行,要么完全不执行。不论发生何种情况,DBS必须保证事务能正确、完整地执行。  
3.事务的组成
   DBS的主要意图是执行“事务”。事务是数据库环境中一个逻辑工作单元,相当于操作系统环境中的“进程”概念。一个事务由应用程序中的一组操作序列组成,在程序中,事务以BEGIN TRANSACTION语句开始,以COMMIT语句或ROLLBACK语句结束。
   COMMIT语句表示事务执行成功地结束(提交),此时告诉系统,数据库要进入一个新的正确状态,该事务对数据库的所有更新都已交付实施(写入磁盘)。ROLLBACK语句表示事务执行不成功地结束(应该“回退”),此时告诉系统,已发生错误,数据库可能处在不正确的状态,该事务对数据库的所有更新必须被撤销,数据库应恢复该事务到初始状态。
4.实例
(1)转账的操作
   设银行数据库中有一转账事务T,从账号A转一笔款子($50)到账号B,其操作如下:
   T:
   read(A);
   A:=A–50;
   write(A);
   read(B);
   B:=B + 50;
   write(B)

(2)作为事务的操作
   上述转账中的所有操作应视为一个整体,不可分割,要么全做,要么全不做,决不允许只做了一半操作。因此这个转账操作应该是一个事务。如果考虑到转账时不允许发生账号透支的情况,那么在组织成事务时,应加上事务开始语句和结束语句加以界定:
T:   BEGIN TRANSACTION; /*事务开始语句*/ read(A);   A:=A-50;   write(A);   if (A<0) ROLLBACK; /*事务回退语句*/ else {          read(B);          B:=B+50;          write(B);          COMMIT;          } /*事务提交语句*/    ROLLBACK语句表示在账号A扣款透支时,就拒绝这个转账操作,执行回退操作,数据库的值恢复到这个事务的初始状态。COMMIT语句表示转账操作顺利结束,数据库处于新的一致性状态。

(3)数据库的读写操作
   对数据库的访问是建立在读和写两个操作的基础上的:
   ①read(X):把数据X从磁盘的数据库中读到内存的缓冲区中。
   ②write(X):把数据X从内存缓冲区中写回磁盘的数据库。
   在系统运行时,write操作未必导致数据立即写回磁盘,很可能先暂存在内存缓冲区中,稍后再写回磁盘。这件事情是DBMS实现时必须注意的问题。 6.1.2 事务的ACID性质
1.原子性(Atomicity)
   一个事务对数据库的所有操作,是一个不可分割的工作单元。这些操作要么全部执行,要么什么也不做(就对DB的效果而言)。
   保证原子性是数据库系统本身的职责,由DBMS的事务管理子系统来实现。

2.一致性(Consistency)
   一个事务独立执行的结果,应保持数据库的一致性,即数据不会因事务的执行而遭受破坏。
   确保单个事务的一致性是编写事务的应用程序员的职责。在系统运行时,由DBMS的完整性子系统执行测试任务。

3.隔离性(Isolation)
   在多个事务并发执行时,系统应保证与这些事务先后单独执行时的结果一样,此时称事务达到了隔离性的要求。也就是在多个事务并发执行时,保证执行结果是正确的,如同单用户环境一样。
   隔离性是由DBMS的并发控制子系统实现的。

4.持久性(Durability)
   一个事务一旦完成全部操作后,它对数据库的所有更新应永久地反映在数据库中,不会丢失。即使以后系统发生故障,也是如此。
   持久性由DBMS的恢复管理子系统实现的。