为何要有事务?html
假设咱们在进行银行转账的时候,至少会执行两条SQL语句,一条SQL语句是减小转账人里账户的钱,一条是增长收账人里账户钱。 例若有一个朋友要转账1000元:一、那么转账人的银行里的钱减小1000 sql
二、那么收账人的银行里的钱增长1000数据库
咱们往深一点想,在执行这两条SQL语句的时候,会不会发生问题?会,有时候天灾,人祸的。例如。在执行第一条SQL语句的时候,就在这0.001秒之间机器忽然出现故障,那么这时候有可能第二条SQL语句没有执行。那这时候转账人不就很惨,他本身转账了1000元,本身账户已经扣了钱,但是对方的账户没收到钱,那么对方会很生气的认为你没有给他转账。.net
这仍是两条SQL语句出现问题的状况,试想若是银行在处理事务时有100条SQL语句要执行,每条都很重要,那么出现问题的几率不是更大了吗?为了针对这种状况出现了事务。code
那么什么是事务?htm
事物是指访问并可能更新数据库中各类新据项的一个程序执行单行(UNIT),也就是由多个SQL语句组成,必需做为一个总体执行。 事物说白了一点,就是同生共死,意思要么所有的SQL语句都执行成功,要么所有的SQL语句都执行失败。因此为了防止上面那种状况,要么两条SQL语句都执行成功,要么两条SQL语句都执行失败。blog
经过例子来了解一下事务,在举个例子前先看一下,先看几个事务经常使用到的词事务
当没有发生错误的时候即可以将事务进行提交(CIMMIT TRANSACTION),而查看有没有SQL语句的执行错误,能够用 @@ERROR来进行查看。当发生错误的时候便使用(ROLL BACK TRANSACTION)将SQL语句回滚到最最以前,没有执行SQL语句那时候。get
先来经过表后插入两条SQL语句再更新,看一下失败的状况博客
代码以下:
View Code
--消息 547,级别 16,状态 0,第 1 行
--UPDATE 语句与 CHECK 约束"CK__bank__balance__0519C6AF"冲突。该冲突发生于数据库"test",表"dbo.bank", column 'balance'。
--语句已终止。
--(1 行受影响)
select * from bank
bid balance
001 1000.00
002 1100.00
查看结果发现 002的值增长了1000,可是001的值并无变为0。
如何用SQL语句建立事务,避免上面那种状况
DECLARE @sumError int set @sumError=0 BEGIN TRANSACTION update bank set balance=balance-1000 where bid='001'; set @sumError = @sumError +@@Error update bank set balance=balance+1000 where bid='002'; set @sumError = @sumError +@@Error IF(@sumError = 0) BEGIN COMMIT TRANSACTION END ELSE BEGIN ROLLBACK TRANSACTION END
--经过上面的事务代码,两条代码要么同时执行成功,要么同时执行失败
转自博客园:http://www.cnblogs.com/cxeye/archive/2012/08/17/2643482.html