zoukankan      html  css  js  c++  java
  • Sql server数据库设计 5

                      第五章(事物处理)

    事物的概念

        事物是一种机制,每个事物是一个独立的工作单元,包含了一组数据库操作命令,是一个不可分割的工作单元

    事物的特性  

        事务必须具备以下四个属性,简称ACID 属性:
          1、原子性(Atomicity):事务是一个完整的操作。事务的各步操作是不可分的(原子的);要么都执行,要么都不执行。
          2、一致性(Consistency):当事务完成时,数据必须处于一致状态。
          3、隔离性(Isolation):对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务。
          4、永久性(Durability):事务完成后,它对数据库的修改被永久保持,事务日志能够保持事务的永久性。
    如何创建事物
         一、T-SQL使用下列语句来管理事务:
          1、开始事务:BEGIN TRANSACTION
          2、提交事务:COMMIT TRANSACTION
          3、回滚(撤销)事务:ROLLBACK TRANSACTION
        二、一旦事务提交或回滚,则事务结束。
        三、判断某条语句执行是否出错:
          使用全局变量@@ERROR;
          @@ERROR只能判断当前一条T-SQL语句执行是否有错,为了判断事务中所有T-SQL语句是否有错,我们需要对错误进行累计;     
               如: SET  @errorSum=@errorSum+@@error
        eg:

            BEGIN TRANSACTION     开始事务(指定事务从此处开始,后续的T-SQL语句都是一个整体)

              /*--定义变量,用于累计事务执行过程中的错误--*/

              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  --累计是否有错误

          IF @errorSum<>0  --如果有错误

              BEGIN        根据是否有错误,确定事务是提交还是撤销

                  print '交易失败,回滚事务'

                  ROLLBACK TRANSACTION      如果有错,则回滚操作,事务结束

              END         

        ELSE

        BEGIN

              print '交易成功,提交事务,写入硬盘,永久的保存'

              COMMIT TRANSACTION      如果成功,则提交操作,事务结束

         END

        GO

          print '查看转账事务后的余额'

          SELECT * FROM bank 

       GO

    事物的分类  
        一、显示事务:用BEGIN TRANSACTION明确指定事务的开始,这是最常用的事务类型
        二、隐性事务:通过设置SET IMPLICIT_TRANSACTIONS ON 语句,将隐性事务模式设置为打开,下一个语句自动启动一个新事务。当该事务完成时,
             再下一个 T-SQL 语句又将启动一个新事务
        三、自动提交事务:这是 SQL Server 的默认模式,它将每条单独的 T-SQL 语句视为一个事务,如果成功执行,则自动提交;如果错误,则自动回滚。

    创建事物的原则
        创建事务时要遵守一下的原则:
            1、事务要尽可能的简短
            2、在事务中访问的数据量要尽量最少
            3、浏览数据是尽量不要打开事务
            4、在事务处理期间不要请求用户输入

     在存储过程中使用事物

          eg:

              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

    使用事物的注意事项

        1、在每个操作之后,都要检查@@error或rowcount的值;
        2、当一个事务结束之后,紧跟在事务之后的T-SQL代码可以继续执行,但是出错后不能再回滚事务了;
        3、已经提交完毕的事务会将数据正式写入数据库;
        4、在一个事务执行时,如果发生如断电等意外事件,则在下次重新启动系统时,该事务会自动回滚;
        5、在事务里发生错误是的事务无法执行下去,事务也会自动回滚;
        6、无法回滚的语句不能在事务中使用。
    事物的工作原理   
        1、在事务开始时,SQLServer会将要修改的数据锁定,同时创建一个临时的事务日志,在该临时的事务日志里存放更改的数据和更改的存储过程。
        2、在事务未提交之前,事务中所有的数据操作是临时的,一旦发生数据操作失败,就使用临时日志里的数据去回滚事务操作,并解除锁定。在事务被成功提交后,
          数据库就将临时的事务日志的内容存储到数据库中,此时事务操作完成。
    事物的隔离级别 
          在SQL Server 中事务的隔离级别由低到高分为5个级别:
            1、Read uncommitted:不隔离数据
            2、Read committed:不允许读取没有提交的数据
            3、Repeatable Read:在事务中锁定所读取的数据不让别人修改和删除。
            4、Snashot:快照隔离,可以为读取数据的事务提供所需数据的一个已提交的版本。
            5、Serializable:将事务所要用到的数据表全部锁定,不与许其它事务添加、修改和删除数据。
     
     
    心得:需要了解什么是事物,记住事物的4个基本特性,掌握事务的创建和掌握在存储过程中使用事务
     
     
  • 相关阅读:
    【转】Android开发——MediaProvider源码分析(2)
    关于ActivityGroup使用过程中遇到的一点问题
    HttpWebRequest详解
    关于Assembly.CreateInstance()与Activator.CreateInstance()方法的区别
    你会在C#的类库中添加web service引用吗?
    ASP.NET跳转网页的三种方法的比较
    .net发送HTTP POST包
    依赖注入
    微软ASP.NET MVC Beta版本发布
    随笔~
  • 原文地址:https://www.cnblogs.com/yuxiaoyanran/p/3066398.html
Copyright © 2011-2022 走看看