5.2 事务管理
5.2 事务管理
为什么需要事务机制?
通常要允许多个用户的并发访问提升效率,但要进行管理控制,否则造成存取不正确的数据,从而破坏数据一致性。
5.2.1 事务
事务(Transaction)指由构成单个逻辑处理单元的一组数据库访问操作。
这些操作的SQL语句被封装在一起,它们要么都被成功执行,要么都不被执行。
事务是数据库调度中的最小单位-- 并发控制和系统恢复
事务的组成
在关系数据库中,一个事务程序可以由一条SQL语句组成,也可以由一组SQL语句组成。
DBMS自动记录每个事务的生命周期状态,以便在不同状态下进行不同的操作处理。
事务生命周期状态:
(初始状态是把事务的程序调入内存)
5.2.2 事务的特性ACID
即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持续性(Durability)。
1.原子性
指事务的数据库操作序列必须在一个原子的工作单元中。
即事务中SQL语句对数据的修改操作,要么全都被正确地执行,要么全都不被执行。
2.一致性
指事务执行的结果使数据库从一种正确数据状态变迁到另一种正确数据状态。
例如,在银行转账业务操作中,从A账户转账100元到B账户。不管业务操作是否成功, A账户和B账户的存款总额是不变的。
3.隔离性
事务隔离性指当多个事务并发执行时,一个事务的执行不被其他事务干扰,各个并发事务之间不能相互影响。
4.持续性
事务持续性指一个事务一旦提交,它对数据库中数据的改变应该是永久性的
5.2.3 事务的并发执行
事务并发执行是指多个事务程序在数据库系统中同一时段运行。
并发执行的关键必须是和事务串行执行的结果一致, 不能出现不同的调度结果
调度的原则是可串行化
并发执行的原因
1.改善系统的资源利用率
一个事务是由多个操作组成的,当多个事务串行执行时,I/O资源可以与CPU资源并行使用,只能依次使用,系统资源利用率较低。
2.减少事务执行的平均等待时间
与操作系统进程或线程并发执行的动机是一样的
5.2.4 事务SQL语句
用SQL提供的事务控制语句及其他SQL操作语句编写事务程序。
SQL事务控制语句
- BEGIN、START TRANSACTION 事务开始
- ROLLBACK 事务回滚
- COMMIT为 事务提交
- SAVEPOINT 事务保存点
SQL事务处理语句块基本框架
能使用DML或DQL类型(如INSERT、UPDATE、DELETE和 SELECT)
BEGIN;
SQL语句1;
SQL语句2;
…
SQL语句n;
COMMIT;(或ROLLBACK;)
【例】使用事务程序实现数据插入:
BEGIN;
INSERT INTO college( collegeID, collegename)
VALUES ('004', ’外语学院’);
COMMIT ;
保存点语句
BEGIN;
SQL语句1;
SQL语句2;
…
SAVEPOINT 保存点名;
SQL语句n;
…
ROLLBACK 保存点名;
【例】
BEGIN;
INSERT INTO Course VALUES ( 'C001',’数据库原理及应用’, ’学科基础’, 4, 64, ’考试’ );
INSERT INTO Course VALUES ( 'C002',’操作系统基础’, ’学科基础’, 4, 64, ’考试’ );
INSERT INTO Course VALUES ( 'C003',’数据结构与算法’ , ’学科基础’, 4, 64, ’考试’);
SAVEPOINT TempPoint;
INSERT INTO Course VALUES ( 'C004',’面向对象程序设计’ , ’学科基础’, 3, 48, ’考试’ );
INSERT INTO Course VALUES ( 'C005',’软件测试’, ’专业核心’, 3, 48, ’考试’ );
ROLLBACK TO TempPoint;
COMMIT;
事务除了按上述显示方式控制SQL操作语句序列执行外,还可以使用DBMS默认方式执行SQL操作语句
即在DBMS默认设置下,每条SQL操作语句都单独构成一个事务,不需要使用专门的事务控制语句标记事务开始与事务结束。
不能在事务中执行的SQL语句
不能使用:DDL类型,因为这类操作语句会在数据库中自动提交,导致事务中断。
- 创建数据库(CREATE DATABASE)
- 修改数据库(ALTER DATABASE)
- 删除数据库(DROP DATABASE)
- 恢复数据库(RESTORE DATABASE)
- 加载数据库(LOAD DATABASE)
- 备份日志文件(BACKUP LOG)
- 恢复日志文件(RESTORE LOG)
- 授权操作(GRANT)