1.什么是事务
事务(TRANSACTION)是作为单个逻辑工作单元执行的执行的一系列操作,它具有四个特性:原子性、一致性、隔离性和永久性。其最大的特点就是:这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行。
2.为什么需要事务
下面以一个转账的例子来进行说明:
假设用户A和用户B中的账户金额currentMoney都为1001元, 用户A转账1000给用户B,我们对应的SQL语句如下:
update bank set currentMoney=currentMoney-1000 where customerName='用户A' ;
update bank set currentMoney=currentMoney+1000 where customerName='用户B' ;
如果在执行玩上面的第一个SQL语句后出现系统故障或其他原因,导致第二个SQL语句没有执行成功,则执行后的结果为:用户A的currentMoney为1,用户B的 currentMoney为1001,即用户A的金额扣掉了,但用户B的金额并没有增加。
针对上面的情况,我们就要考虑,对于这种转账业务,我们应该将上面的两个update语句捆绑到一起,使得他们要么都执行成功,要么都执行不成功,才能保证用户的金额不会造成损失,这时我们就要用到事务了。
具体的SQL语句如下:
begin transactiondeclare @i int
set @i=0
update bank
set currentMoney=currentMoney-1000 where customerName='用户A'
set @i=@i+@@error
update bank
set currentMoney=currentMoney+1000 where customerName='用户B'
set @i=@i+@@error
if(@i<>0)
rollback transaction
else
commit transaction
上面的语句中begin transaction是开始事务,rollback transaction是回滚事务,commit transaction是提交事务。
用到了全局变量@@error,@@error是返回上一条T-SQL语句执行的错误号,只有前一个T-SQL语句执行没有错误时,才返回0,而且在每一条语句执行后被清除并且重置。
即使用上面的事务后,两个update语句中有一个没有执行或没有执行成功的话,就会进行事务回滚,即用户A和用户B的金额都不发生变化;只有两个update语句都执行成功后,才会提交事务。
所以我们一下任务有多个操作的情况下,一般都用事务进行处理,以便于在出错时也能保持数据的一致性。
事务(TRANSACTION)是作为单个逻辑工作单元执行的执行的一系列操作,它具有四个特性:原子性、一致性、隔离性和永久性。其最大的特点就是:这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行。
2.为什么需要事务
下面以一个转账的例子来进行说明:
假设用户A和用户B中的账户金额currentMoney都为1001元, 用户A转账1000给用户B,我们对应的SQL语句如下:
update bank set currentMoney=currentMoney-1000 where customerName='用户A' ;
update bank set currentMoney=currentMoney+1000 where customerName='用户B' ;
如果在执行玩上面的第一个SQL语句后出现系统故障或其他原因,导致第二个SQL语句没有执行成功,则执行后的结果为:用户A的currentMoney为1,用户B的 currentMoney为1001,即用户A的金额扣掉了,但用户B的金额并没有增加。
针对上面的情况,我们就要考虑,对于这种转账业务,我们应该将上面的两个update语句捆绑到一起,使得他们要么都执行成功,要么都执行不成功,才能保证用户的金额不会造成损失,这时我们就要用到事务了。
具体的SQL语句如下:
begin transactiondeclare @i int
set @i=0
update bank
set currentMoney=currentMoney-1000 where customerName='用户A'
set @i=@i+@@error
update bank
set currentMoney=currentMoney+1000 where customerName='用户B'
set @i=@i+@@error
if(@i<>0)
rollback transaction
else
commit transaction
上面的语句中begin transaction是开始事务,rollback transaction是回滚事务,commit transaction是提交事务。
用到了全局变量@@error,@@error是返回上一条T-SQL语句执行的错误号,只有前一个T-SQL语句执行没有错误时,才返回0,而且在每一条语句执行后被清除并且重置。
即使用上面的事务后,两个update语句中有一个没有执行或没有执行成功的话,就会进行事务回滚,即用户A和用户B的金额都不发生变化;只有两个update语句都执行成功后,才会提交事务。
所以我们一下任务有多个操作的情况下,一般都用事务进行处理,以便于在出错时也能保持数据的一致性。