三、事务
1、基本概念
事务(transaction)定义:
形成一个逻辑工作单位的数据库操作汇集(集合)。
例如:在关系数据库中,一个事务可以是一条SQL语句、一组SQL 语句或整个程序。
说明:
➢ 是数据库环境中的逻辑工作单位;
➢ 类似于操作系统环境中的"进程"概念;
➢ 一个事务由应用程序中一组操作序列组成,以BEGIN TRANSACTION语句开始,以COMMIT(提交)或ROLLBACK(回滚) 结束。
➢事务和程序是两个概念。一般地讲,一个程序中包含多个 事务。
2、事务的ACID性质
a. 原子性(Atomicity)
一个事务中所有对数据库的操作,是一个不可分割的操作序列。
b. 一致性(Consistency)
一个事务独立执行的结果,将保持数据库的一致性,即数据不 会因事务的执行而遭受破坏。
c. 隔离性(Isolation)
多个事务并发执行时,系统应保证与这些事务先后单独执行时 的结果一样。
d. 持久性(Durability)
一个事务一旦完成全部操作,它对数据库的所有更新应永久性 地反映在数据库中。
2、事务的ACID性质
数据库的访问:
I. read(X):把数据X从数据库中读到内存缓冲区
II. write(X):把数据X从内存缓冲区写回数据库

举例:银行数据库中有一转帐事务Ti,从帐号A转一笔款(¥50) 到帐号B。
其操作如下:

原子性: 事务中所有操作应作为一个整体,不能分割,要么全做,要么全 不做。 如果只修改了A的值而没有修改B的值,就违反了事务的原子性。
一致性: 在事务Ti执行结束后,要求数据库中A的值减50,B的值增50, 即A与B的和不变,此时称数据库处于一致状态。
隔离性: 同时两个事务Ti和Tj对A、B操作,彼此独立,互不干涉。
持久性: 事务的持久性保证事务成功执行后,所有对数据库修改的影响 应长期存在,不能丢失。既使计算机系统的故障导致内存中数 据丢失,但写入磁盘的数据也决不能丢失。
3、事务的写法
Begin transaction
read A
A:=A-s
If A<0 then display "insufficient fund"
Rollback
Else B:=B+s
Display"transfer complete"
Commit
4、事务的状态变迁

在事务开始执行后,立即进入"活动"状态。 在活动状态,事务执行对数据库的读/写操 作。但是"写操作"并不立即写到磁盘上, 很可能暂时存放在系统缓冲区中。
事务的最后一个语句执行之后, 进入"局部提交"状态。事务 执行完毕,但对数据库的修改, 可能还在内存的系统缓冲区中, 事务还没有真正结束。
处于活动状态的事务还没 有执行完最后一个语句就 中止执行,事务进入"失 败"状态。
在局部提交状态,虽然事务的 语句执行结束,但对数据库的 修改可能还没有写到数据库。 此时,如果系统出现故障,事 务将进入"失败"状态。
处于失败状态的事务,可能已 对磁盘中的数据进行了部分修 改。为了保证事务的原子性, 应该撤销该事务对数据库已做 的修改。称为事务的回退。
事务进入异常中止状态,系统可 以重新启动(软硬件故障),或 取消事务(事务逻辑错误)。
事务进入局部提交状态后,并发控制系统 将检查并发事务之间是否存在干扰现象, 通过检查后,系统执行提交操作,把对数 据库的修改全部写到磁盘上。事务成功结 束,进入"提交"状态。
5、事务的并发执行
事务的语句分为两类:
➢ I/O活动 顺序执行
➢ CPU活动 并发执行
定义:事务的执行次序称为"调度"。
多个事务依次执行-》串行调度
利用分时方法同时处理多个事务-》并发调度
例:事务T1从帐号A转¥100到帐号B,事务T2从帐号A转 10%到帐号B。
初始:A=2000 B=1000 串行调度1: 先执行T1,后执行T2 结束:A=1710 B=1290

初始:A=2000 B=1000 串行调度2: 先执行T2,后执行T1 结束:A=1700 B=1300

初始:A=2000 B=1000 并发调度1 结束:A=1710 B=1290 正确的并发调度

初始:A=2000 B=1000 并发调度2 结束:A=1900 B=1300 错误的并发调度

6、并发事务的可串行化
并发调度中,有的可以保持数据 库的一致性,有的不能。
冲突可串行化
设有事务Ti和Tj,其调度为S,S中有两个相邻的语 句Ii和Ij,分别来自Ti和Tj,并对同一数据Q操作。存 在以下可能:
➢Ii=read(Q),Ij=read(Q);
➢ Ii=read(Q),Ij=write(Q);
➢ Ii=write(Q),Ij=read(Q);
➢ Ii=write(Q),Ij=write(Q);
定义 Ii和Ij分别是并发事务Ti和Tj中的read或write 语句,并在并发调度中相邻。当Ii和Ij是对同一数据操 作时,并且至少有一个是write语句,我们称Ii和Ij是 一对"冲突"的语句,否则称为"非冲突"语句。
在调度S中,有一对相邻的语句是"非冲突"的语句,那么它们的先后 次序可以交换,交换后产生的新调度S'与S等价,即产生相同的执行结果。
定义 如果调度S'是从调度S通过交换一系列的非冲突语句得到,那么 称S'和S是一对"冲突等价"的调度。 如果调度S与某个串行调度是"冲突等价",那么称S是"冲突可串 行化"的调度。
7、SQL中的事务定义
SQL没有专门的事务开始语句,每一个对数据库或关系的查 询与操作都包含着一个事务的开始。事务的结束语句是COMMIT或 ROLLBACK。
➢ COMMIT:提交当前事务,并开始一个新的事务;
➢ ROLLBACK:中止当前事务,执行回退操作,开始新事务。
事务的读写类型
➢ READ ONLY 只读型
➢ READ WRITE 读写型
SQL定义:
SET TRANSACTION READ ONLY
SET TRANSACTION READ WRITE
事务的一致性级别
➢ SERIALIZABLE 可串行化
➢ REPEATABLE READ 可重复读写
➢ READ COMMITTED 读提交数据
➢ READ UNCOMMITTED 可以读未提交数据
SQL定义:
SET TRANSACTION ISOLATION SERIALIZABLE
SET TRANSACTION ISOLATION REPEATABLE READ
SET TRANSACTION ISOLATION READ COMMITTED
SET TRANSACTION ISOLATION READ UNCOMMITTED