好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Databse Transaction

Databse Transaction

数据库事务(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:将事务所要用到的数据表全部锁定,不与许其它事务添加、修改和删除数据。

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于Databse Transaction的详细内容...

  阅读:39次

上一篇: UDP通信

下一篇:第三章 匿名方法