`
harrison2010
  • 浏览: 106073 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

事务的特性

阅读更多
原子性:不论内部情况如何,从外部看,事务是一个整体--像原子那样不能分割。原子性并不是说事务和原子一样简。根据业务逻辑的复杂程度,事务可以简单到一两行SQL语句,也可以复杂到包含上千行的SQL语句。
 一致性:事务能保证数据库的一致性。事务将数据库从一个一致的状态转变为另一个一致的状态。
 隔离性:事务往往是存在并发的。为了简化系统编写的难度,数据库系统必须保证事务之间是相互隔离的,即在一个事务执行时,开发人员不需要关心是否并发。
 持久性:一个事务执行完成以后,数据库系统必须保证事务对数据库的影响已经永久保存下来了。
 
 建立测试用数据表。Col1字段加了约束,取值必须小于20

  USE NorthWind
  Create Table Tran_Test(id int identity(1,1),col1 int not null Check(col1<20))
  GO
  Declare @i AS int
  Select @i=1
  While @i<=10
    Begin
      Insert into Tran_Test Values (@i)
      Select @i=@i+1
    End
  GO

  要使用事务,需要引用三个命令
  Begin Tran   : 启动事务,它告诉SQL SERVER一个事务开始了,要求系统按照ACID的标准来处理事务中的语句。
  Commit : 提交事务,它告诉SQL SERVER事务执行成功,可以把Begin Tran以后的所有SQL语句造成的数据变成写入磁盘。
  RollBack : 撤消事务,它告诉SQL SERVER把Begin Tran以后的所有SQL 语句造成的数据变动撤消,就像他们从来没有执行过一样。

  例子:
     Declare @ErrorCode int
     Select @ErrorCode = 0
     Begin Tran
     Insert into Tran_Test Values (121)
     Select @ErrorCode = @@Error
     IF @ErrorCode = 0 
       Begin
         Update Tran_Test Set col1=col1-3
         Select @ErrorCode = @@Error
       End
     IF @ErrorCode = 0 
       Begin
         Insert into Tran_Test Values (15)
         Select @ErrorCode = @@Error
       End
     If @ErrorCode = 0
       Begin
         Commit
       End
     Else
       Begin
         RollBack
       End

   由此可见,保留事务中每一句SQL 语句的执行状态(@ErrorCode),才能确保事务的原子性。这种用一个值跟踪语句执行状态的方法是一种通用的出错处理方法。

   上面的事务属于显示事务,隐式事务正好相反,它不需要用BEGIN TRAN开启事务,而是由一些常见的SQL语句 (UPDATE INSERT)开启

    隐式事务的写法
 1,在代码开头用 SET IMPLICIT_TRANSACTIONS ON
 2,去掉BEGIN TRAN 
 3,在代码结束恢复系统默认设置 SET IMPLICIT_TRANSACTIONS ON

    注意COMMIT  ROLLBACK是始终需要的

   *******   三种冲突,四种隔离级别  重点学习,并发冲突  *********

   为了取得平衡,分析了并发冲突的问题,总结出三类冲突,并且根据用户对冲突问题的承受能力,为事务设计了四种隔离级别,由数据库系统根据事先高的事务隔离级别自动加锁、解锁,取得了提高并发能力,防范并发冲突以及减轻开发人员负担这个方面的统一
    三类冲突问题分别是“脏读”,“不可重复读”和“幻影读”。四种隔离级分别是“读未提交”,“读已提交”,“可重复读”,“可串行化”。这四种隔离级别也可以看做四种不同的锁的方案。总地来说,“读未提交”是一种无锁的状态,不能对付任何并发冲突;“读已提交”可以对付“脏读”;“可重复读”可以对付“脏读”和“不可重复读”这两种并发冲突;“可串行化”可以对付所有三种并发冲突。

    SQL SERVER默认的事务隔力级别是“读已提交”。可以通过SET TRANSACTION ISOLATION LEVEL来修改事务的隔离级别

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
   .....
   .....
   ...
  SET TRANSACTION ISOLATION LEVEL COMMITTED

2
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics