数据库事务

      所谓的数据库事务就是指作为单个逻辑工作单元的一系列操作。使用事务处理可以确保除非事务性单元内的所有操作都成功完成(操作完成之后对系统的影响是永久性的),否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性持久性一致性隔离性)属性。

 1、原子性
      工作单元内所有操作组成的集合不存在比起更小的自己,即原子工作单元,这样才能确保对数据的修改:要么都执行,要么都不执行。

2、持久性
      事务完成以后,其对系统的影响、对数据的修改将是永久性的,不可逆的。

3、一致性
      事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。

4、隔离性
      由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。

事务的启动、结束、回滚的用法

1、事务启动
Begin transaction标记一个显式本地事务的起始点。BEGIN TRANSACTION将 @@TRANCOUNT 加 1。

BEGIN TRAN [ SACTION ] [ transaction_name | @tran_name_variable
    [ WITH MARK [ 'description' ] ] ]

transaction_name
     
是给事务分配的名称。transaction_name 必须遵循标识符规则,但是不允许标识符多于 32 个字符。仅在嵌套的 BEGIN...COMMIT 或 BEGIN...ROLLBACK 语句的最外语句对上使用事务名。

@tran_name_variable
     
是用户定义的、含有有效事务名称的变量的名称。必须用 charvarcharncharnvarchar 数据类型声明该变量。

WITH MARK ['description']
      指定在日志中标记事务。Description 是描述该标记的字符串。如果使用了 WITH MARK,则必须指定事务名。WITH MARK 允许将事务日志还原到命名标记。

例如:
declare @mytrannvarchar(10)
select @mytran='Aillo'
begin transaction Aillo    或者    begin transaction @mytran 

2、事务结束:
Commit transaction 标志一个成功的隐性事务或用户定义事务的结束。如果 @@TRANCOUNT 为 1,COMMIT TRANSACTION 使得自从事务开始以来所执行的所有数据修改成为数据库的永久部分,释放连接占用的资源,并将 @@TRANCOUNT 减少到 0。如果 @@TRANCOUNT 大于 1,则 COMMIT TRANSACTION 使 @@TRANCOUNT 按 1 递减。

COMMIT [ TRAN [ SACTION ] [ transaction_name | @tran_name_variable ] ]

例如:commit transaction Aillo    或者    commit transaction @mytran

3、事务保存点
Save Transaction设置事务的保存点

SAVE TRAN [ SACTION ] { savepoint_name | @savepoint_variable }

savepoint_name
     
是指派给保存点的名称。保存点名称必须符合标识符规则,但只使用前 32 个字符。

@savepoint_variable
     
是用户定义的、含有有效保存点名称的变量的名称。必须用 charvarcharncharnvarchar 数据类型声明该变量。

例如:save transaction @mysavePoint

4、事务回滚
将显式事务或隐性事务回滚到事务的起点或事务内的某个保存点。

ROLLBACK [ TRAN [ SACTION ]
    
[ transaction_name | @tran_name_variable
      | savepoint_name | @savepoint_variable ] ]

savepoint_name
      是来自 SAVE TRANSACTION 语句的 savepoint_namesavepoint_name 必须符合标识符规则。当条件回滚只影响事务的一部分时使用 savepoint_name

@savepoint_variable
      是用户定义的、含有有效保存点名称的变量的名称。必须用 charvarcharncharnvarchar 数据类型声明该变量。

例如:rollback transaction Aillo    或者    rollback transaction @mttran