事务处理 基本知识点(2004.07)
1. 事务:就是把多个不可分割的操作当作一个逻辑单元来执行。其特征为ACID 。
2.实现(支持)ACID的机制是:加锁(I),日志机制(A、D),事务管理机制(A、C)。
3.实现事务的三种方式
(1)通过后台数据库的SQL语句来实现(因为没有返回值,所以无法知道事务是正确执行了还是回滚了)
(2)通过ADO.NET组件实现。使用IDbTransaction==》代码结构清晰,但在硬编码的情况下任何修改业务逻辑或用户需求的都需要重新修改并编译源代码。IDbTransaction myTran =myConn.BeginTransaction();
(3)通过COM+提供的事务支持实现事务处理。用到ContextUtil类的静态方法。
(4)IDbTransaction不支持跨数据库的事务,如果需要使用跨数据库的事务请使用COM+。
Note:ADO.NET的IDbTransaction实现事务处理时调用的时后台数据库的事务处理引擎,而COM+则是调用COM+支持的DTC(分布式事务协同器)服务来实现的。事实上,ADO.net 事务完全在数据库的内部处理,且不受 Microsoft 分布式事务处理协调器 (DTC) 或任何其他事务性机制的支持。
4.分布式事务处理的两种实现
(1)基于链接服务器实现==》可以封装成存储过程,业务修改时方便。
首先需要构建链接服务器,然后就可以将远程服务器当作本地服务器一样处理。(SQL语句中加入DISTRIBUTED)
(2)基于COM+的实现==》部署方便
需要DTC事务处理引擎与不同数据库的事务管理器通讯,发送需要执行的事务操作,数据库的事务管理器执行完后将结果返回给DTC,如果所有的事务管理器返回的都是正确信息,则DTC发出提交指令到各个数据库事务管理器,数据修改提交到后台数据库,分布式事务完成。如果由任何一个数据事务管理器返回错误信息,则DTC发出回滚指令,分布式事务撤销。==》两阶段提交的分布式事务操作。
5.事务的孤立级别==》并发与死锁控制
事务孤立级别分四种:由高到低为:
(1)SERIALIZABLE:读取数据时,锁定整个表
(2)REPEATABLE READ:锁定所有数据(但是允许其他用户插入数据)
(3)READ COMMITED:对相应的数据加共享锁防止脏读。
(4)READ UNCOMMITED:允许脏读,可读到其他事务执行过程中尚未提交的 数据。
设置事务级别的两种方式:
(1)设置 IDbTransaction的IsolationLevel
(2)调用IDbTransaction派生类的构造函数时提供孤立级别设置。
6.存储过程在执行效率和安全性上都比直接的SQL语句效率要高。
7.以下SQL语句不能出现在事务中:
ALTER DATABASE修改数据库
BACKUP LOG备份日志
CREATE DATABASE创建数据库
DISK INIT创建数据库或事务日志设备
DROP DATABASE删除数据库
DUMP TRANSACTION转储事务日志
LOAD DATABASE装载数据库备份复本
LOAD TRANSACTION装载事务日志备份复本
RECONFIGURE 更新使用 sp_configure 系统存储过程更改的配置选项的当前配置(sp_configure 结果集中的 config_value 列)值。
RESTORE DATABASE还原使用BACKUP命令所作的数据库备份
RESTORE LOG还原使用BACKUP命令所作的日志备份
UPDATE STATISTICS在指定的表或索引视图中,对一个或多个统计组(集合)有关键值分发的信息进行更新
8.使用存储点
事务存储点提供了一种机制,用于回滚部分事务。因此,我们可以不必在更新之前检查更新的有效性,而是预设一个存储点,在更新之后,如果没有出现错误,就继续执行,否则回滚到更新之前的存储点。要注意的是,更新和回滚代价很大,只有在遇到错误的可能性很小,而且预先检查更新的有效性的代价相对很高的情况下,使用存储点才会非常有效。
定义一个存储点“NoUpdate”: myTran.Save("NoUpdate");
回滚事务到存储点“NoUpdate”:myTran.Rollback("NoUpdate");