SQL Sever数据库之事务

事务是单个的工作单元,是作为单个逻辑工作单元执行的一系列操作。如果某一事务成功,则在该事务中进行的所有数据修改均会提交,成为数据库中的的永久组成部分。如果事务遇到错误且必须取消或回滚,则所有数据修改均被清除。每个事务(非隐式)均应以BEGIN TRANSACTION语句显式开始,以COMMINT或ROLLBACK语句显式结束(包括隐式)。


事务模式:自动提交事务,显式事务,隐式事务,批处理级事务。


BEGIN TRANSACTION 语句与下一条的COMMIT TRANSACTION 语句之间的所有事情作为单个事务。如果SQL Sever 遇到一条COMMINT TRANSACTION,那么保存自最近一条BEGIN TRANSACTION语句以后对数据库所做的工作;如果SQL Sever遇到一条ROLLBACK TRANSACTION语句,则将抛弃所有这些工作。


ACID属性:原子性,一致性,隔离性,持久性;


使用事务:

1、BEGIN TRANSACTION:

该语句用来命令SQL Sever开始一个新事物。由连接引用的数据在该点逻辑和物理上都是一致的。如果遇到错误,在BEGIN TRANSACTION之后的所有数据改动都能进行回滚,以将数据返回到已知的一致状态。每个事务继续执行,直到无训地完成并且用COMMIT TRANSACTION对数据库作永久的改动,或者遇上错误并且用ROLLBAKC TRANSACTION语句擦除所有改动。


BEGIN TRANSACTION为发出本语句的连接启动一个本地事务,根据当前事务隔离级别的设置,为支持该连接的发出的T-SQL语句而获取的更多资源被该事务锁定,直到使用COMMIT TRANSACTION或ROLLBACK TRANSACTION语句终止事务为止。


事务是可以嵌套的,原则是必须先提交或回退内层事务,然后再提交或回退外层事务,换句话说,一条COMMIT TRANSACTION或ROLLBACK TRANSACTION语句对应最近的一条BEGIN TRANSACTION.


2、COMMIT TRANSACTION

发布一条COMMIT TRANSACTION语句时,SQL Sever将最近的一个已启动事务标记为准备提交。只有在提交一个嵌套事务系列中的最外层事务时,SQL Sever才将所有修改都写入到数据库中。用户的责任是保证在做完了所有预期的修改之后再发布COMMIT TRANSACTION语句。一旦提交了一个事务,就再也不能回退它。


3、ROLLBACK TRANSACTION

该语句抛弃自最近一条BEGIN TRANSACTION 语句以后的所有修改。ROLLBACK 无法回退嵌套事务系列中的单个事务。ROLLBACK TRANSACTION总是回退到嵌套事务系列当中的第一个事务(即最外层事务)


4、SAVE TRANSACTION

用户可以在事务内设置保存点或标记。保存点可以定义在按条件取消某个事务的一部分后,该事务可以返回的一个位置。如果将事务加滚到保存点,则根据需要必须完成其他剩余的T-SQL语句和COMMIT TRANSACTION 语句,或者必须通过将事务加滚到起始点完全取消事务。


分布式事务:

即对多个数据库中存在的数据做修改的事务。所有节点服务器的子事务要么都提交,要么都回滚。用BEGIN DISTRIBUTED TRANSACTION代替BEGIN TRANSACTION开始事务。


例子:

USE testbase
GO

DECLARE @SS_ERR INT, @RP_ERR INT 
DEGIN TRANSACTION
UPDATE testtable SET COLL1 = 'A' WHERE ID = '1101'
SET @SS_ERR = @@ERROR
SAVE TRANSACTION SSsaved

UPDATE testtable SET COLL2 = 'B' WHERE ID = '1101'
SET @RP_ERR = @@ERROR
IF @RP_ERR<>0
ROLLBACK TRANSACTION SSsaved
IF @SS_ERR = 0 AND @RP_ERR = 0
BEGIN
COMMIT TRANSACTION
PRINT 'CHANGES WERE SUCCESSFUL'
END 
ELSE
ROLLBACK TRANSACTION


解析:如果第二条UPDATE语句上发生错误,第一条ROLLBACK TRANSACTION语句则将事务退回到保存点;如果@SS_ERR = 0 AND @RP_ERR = 0不成立,则第二条ROLLBACK TRANSACTIN语句回退所有工作。