事务处理
事务是 一组组合成逻辑工作单元的数据库操作,在系统执行过程中可能会出错,但事务将控制和维护每个数据库的一致性和完整性。事务处理的主要特征是,任务要么全部 完成,要么都不完成。在写入一些记录时,要么写入所有记录,要么什么都不写入。如果在写入一个记录时出现了一个失败,那么在事务处理中已写入的其他数据就 会回滚。事务可能由很多单个任务构成。
简单事 务的一个常见例子:把钱从A账户转到B账户,这涉及两项任务,即从A账户把钱取出来;把钱存入B账户。两项任务要么同时成功,要么一起失败,给予回滚,以 便保持账户的状态和原来相同。否则,在执行某一个操作的时候可能会因为停电、网络中断等原因而出现故障,所以有可能更新了一个表中的行,但没有更新相关表 中的行。如果数据库支持事务,则可以将数据库操作组成一个事务,以防止因这些事件而使数据库出现不一致。
事务的ACID属性如下。
l 原子性(Atomicity):事务的所有操作是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。原子性消除了系统处理操作子集的可能性。
l 一致性(Consistency):数据从一种正确状态转换到另一种正确状态。事务在完成时,必须使所有的数据都保持一致。在相关数据库中,所有规则都必 须应用于事务的修改,以保持所有数据的完整性。当事务结束时,所有的内部数据结构都必须是正确的。在存款取款的例子中,逻辑规则是,钱是不能凭空产生或销 毁的,对于每个(收支)条目必须有一个相应的抵衡条目产生,以保证账户是平的。
l 隔离性(Isolation):由并发事务所作的修改必须与任何其他并发事务所作的修改隔离。查看数据时数据所处的状态,要么是事务修改它之前的状态,要 么是事务修改它之后的状态。简单的理解就是,防止多个并发更新彼此干扰。事务在操作数据时与其他事务操作隔离。隔离性一般是通过加锁的机制来实现的。
l 持久性(Durability):事务完成之后,它对于系统的影响是永久性的。已提交的更改即使在发生故障时也依然存在。
--==============================创建表 CREATE TABLE [dbo].[t1]( [Id] [int] NOT NULL, [c1] [nvarchar](50) NULL, [c2] [datetime] NULL, ) --=================不进行事务处理,直接插入数据======================= insert into t1(Id, c1) values(1,'此条数据已经插入'); insert into t1(Id, c1) values('aaa','2') --==================================================================== --------------------------获取结果集--------------------------------- select * from t1 -------------------------------------------------------------------- ---id为1的数据已经被插入 --=========================进行事务处理(一)=============================== ---truncate table t1 declare @iErrorCount int set @iErrorCount = 0 begin tran Tran_2015_12_23 insert into t1(Id, c1) values(1,'此条数据已经插入') set @iErrorCount=@iErrorCount+@@error insert into t1(Id, c1) values('aaa','2') set @iErrorCount=@iErrorCount+@@error if @iErrorCount=0 begin COMMIT TRAN Tran_2015_12_23 end else begin ROLLBACK TRAN Tran_2015_12_23 end select * from t1 ------------空表,没有记录 ----=========================================================== ----======================进行事务处理(二)============================ begin try begin tran Tran_2015_12_23 insert into t1(Id, c1) values(1,'此条数据已经插入') insert into t1(Id, c1) values('aa','2') COMMIT TRAN Tran_2015_12_23 end try begin catch print '=========================错误了========================' print '错误描述:'+ERROR_MESSAGE() print '=======================检查后重新运行程序===============' ROLLBACK TRAN Tran_2015_12_23 end catch ------------------------查看结果------------------- select * from t1 ------------空表,没有记录