zoukankan      html  css  js  c++  java
  • 数据库事务(Databse Transaction)

    什么是事务

    是指作为单个逻辑工作单元执行的一系列操作。

    事务处理可以确保除非事务性单元内的所有操作都成功完成,

    否则不会永久更新面向数据的资源。

    通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。

    一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性。

    数据库事务的基本概念

     “一荣俱荣,一损俱损这句话很能体验事物的思想,很多复杂的事物要分步进行,

    但他们组成一个整体,要么整体生效,要么整体失效,这种思想反映到数据库上,

    就是多个SQL语句。要么全部执行成功,要么全部执行失败。

    事务的4个特性

    1. 原子性(Atomicity)
    事务的原子性是指事务中包含的所有操作要么全做,要么全不做(all or none)。

    2. 一致性(Consistency)
    在事务开始以前,数据库处于一致性的状态,事务结束后,数据库也必须处于一致性状态。

    拿银行转账来说,一致性要求事务的执行不应改变A、B 两个账户的金额总和。如果没有这种一致性要求,

    转账过程中就会发生钱无中生有,或者不翼而飞的现象。事务应该把数据库从一个一致性状态转换到另外一个一致性状态。

    3. 隔离性(Isolation)
    事务隔离性要求系统必须保证事务不受其他并发执行的事务的影响,也即要达到这样一种效果:

    对于任何一对事务T1 和 T2,在事务 T1 看来,T2 要么在 T1 开始之前已经结束,要么在 T1 完成之后才开始执行。

    这样,每个事务都感觉不到系统中有其他事务在并发地执行。

    4. 持久性(Durability)
    一个事务一旦成功完成,它对数据库的改变必须是永久的,即便是在系统遇到故障的情况下也不会丢失。

    数据的重要性决定了事务持久性的重要性。

    用T—SQL语句来管理事物:

    • 开始事务:BEGIN TRANSACTION
    • 提交事务:COMMIT TRANSACTION
    • 回滚(撤销)事务:ROLLBACK TRANSACTION

    一旦事务提交或回滚,则事务结束。
    判断某条语句执行是否出错:
    使用全局变量@@ERROR;
    @@ERROR只能判断当前一条T-SQL语句执行是否有错,

    为了判断事务中所有T-SQL语句是否有错,我们需要对错误进行累计;        

        如: SET @errorSum=@errorSum+@@error

    事务的分类: 

    显示事务:用BEGIN TRANSACTION明确指定事务的开始,这是最常用的事务类型
    隐性事务:通过设置SET IMPLICIT_TRANSACTIONS ON 语句,将隐性事务模式设置为打开,

    下一个语句自动启动一个新事务。当该事务完成时,再下一个 T-SQL 语句又将启动一个新事务
    自动提交事务:这是 SQL Server 的默认模式,它将每条单独的 T-SQL 语句视为一个事务,如果成功执行,则自动提交;如果错误,则自动回滚。

    创建事务的实例

    BEGIN TRANSACTION 
    /*--定义变量,用于累计事务执行过程中的错误--*/
    DECLARE @errorSum INT 
    SET @errorSum=0  --初始化为0,即无错误
    /*--转账:保利的账户少2000000元,莱钢的账户多2000000元*/
    UPDATE AccountInfo SET currentMoney=currentMoney-2000000
       WHERE accountName=‘保利集团'
    SET @errorSum=@errorSum+@@error
    UPDATE AccountInfo SET currentMoney=currentMoney+2000000
       WHERE accountName=‘莱钢建设'
    SET @errorSum=@errorSum+@@error  --累计是否有错误

    创建事务

    F @errorSum<>0  --如果有错误
      BEGIN
        print '交易失败,回滚事务'    
        ROLLBACK TRANSACTION 
      END  
    ELSE
      BEGIN
        print '交易成功,提交事务,写入硬盘,永久的保存'
        COMMIT TRANSACTION   
      END
    GO
    print '查看转账事务后的余额'
    SELECT * FROM bank  
    GO 

    创建事务的原则

    • 事务要尽可能的简短
    • 在事务中访问的数据量要尽量最少
    • 浏览数据是尽量不要打开事务
    • 在事务处理期间不要请求用户输入

    在存储过程中使用事务(实例)

    create proc proc_transfer
    --包含个输入参数
        @intoAccountName char(10), --转入帐户
        @outAccountName char(10), ---转出账户
        @money money              --转账金额
    as
    ---判断转入账户是否存在
    if not exists(select 1 from AccountInfo where accountName=@intoAccountName)
    begin
        print'转入账户不存在'
        return
    end
    if not exists(select 1 from AccountInfo where accountName=@outAccountName)
    begin
        print'转出账户不存在'
        return
    end
    declare @errorSum int
    set @errorSum =0
    begin transaction
    UPDATE AccountInfo SET currentMoney=currentMoney-@money 
         WHERE accountName=@outAccountName
                SET @errorSum=@errorSum+@@error
    UPDATE AccountInfo SET currentMoney=currentMoney+@money 
         WHERE accountName=@intoAccountName
                SET @errorSum=@errorSum+@@error  --累计是否有错误
    IF @errorSum<>0  --如果有错误
      BEGIN
        print '交易失败,回滚事务'
        ROLLBACK TRANSACTION 
      END  
    ELSE
      BEGIN
        print '交易成功,提交事务,写入硬盘,永久的保存'
        COMMIT TRANSACTION   
      END
    GO

    使用事务的注意事项

    • 在每个操作之后,都要检查@@error或rowcount的值;
    • 当一个事务结束之后,紧跟在事务之后的T-SQL代码可以继续执行,但是出错后不能再回滚事务了;
    • 已经提交完毕的事务会将数据正式写入数据库;
    • 在一个事务执行时,如果发生如断电等意外事件,则在下次重新启动系统时,该事务会自动回滚;
    • 在事务里发生错误是的事务无法执行下去,事务也会自动回滚;
    • 无法回滚的语句不能在事务中使用。

    事务的隔离级别

    • Read uncommitted:不隔离数据
    • Read committed:不允许读取没有提交的数据
    • Repeatable Read:在事务中锁定所读取的数据不让别人修改和删除。
    • Snashot:快照隔离,可以为读取数据的事务提供所需数据的一个已提交的版本。
    • Serializable:将事务所要用到的数据表全部锁定,不与许其它事务添加、修改和删除数据。

     

  • 相关阅读:
    洛谷 1850 NOIP2016提高组 换教室
    2018牛客多校第三场 C.Shuffle Cards
    2018牛客多校第一场 B.Symmetric Matrix
    2018牛客多校第一场 A.Monotonic Matrix
    2018牛客多校第一场 D.Two Graphs
    2018宁夏邀请赛L Continuous Intervals
    2018宁夏邀请赛K Vertex Covers
    BZOJ
    HDU
    ACM International Collegiate Programming Contest, Egyptian Collegiate Programming Contest (ECPC 2015)
  • 原文地址:https://www.cnblogs.com/xiongzhuang/p/3057180.html
Copyright © 2011-2022 走看看