• 事务处理


    事务处理

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

    简单事 务的一个常见例子:把钱从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
    ------------空表,没有记录
  • 相关阅读:
    cocos2d学习笔录1
    js 动态切换视频
    Android之一个简单计算器源代码
    git-daemon的快捷搭建
    题目1384:二维数组中的查找
    [cocos2d-x]HelloWorldDemo
    ios开发者创建app应用开发授权文件 实战方法:
    一些小工具方法,能将容器转换成指定的数组类型有使用泛型
    Mockito文档-单元测试技术
    【UNIX网络编程】FIFO
  • 原文地址:https://www.cnblogs.com/OliverQin/p/5070125.html
Copyright © 2020-2023  润新知