事务处理

事务处理

事务是 一组组合成逻辑工作单元的数据库操作,在系统执行过程中可能会出错,但事务将控制和维护每个数据库的一致性和完整性。事务处理的主要特征是,任务要么全部 完成,要么都不完成。在写入一些记录时,要么写入所有记录,要么什么都不写入。如果在写入一个记录时出现了一个失败,那么在事务处理中已写入的其他数据就 会回滚。事务可能由很多单个任务构成。

简单事 务的一个常见例子:把钱从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
------------空表,没有记录
原文地址:https://www.cnblogs.com/OliverQin/p/5070125.html