SQL Server事务的使用

1.定义:

事务是作为单个逻辑单元执行的一系列操作,它是一个不可分割的工作逻辑单元。它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行。

举个例子,我们经常用到的 ATM 存取款机,比如转账的时候,是先减去转出账户的金额,然后再在指定转入账户的金额加上转出的金额。如果刚好这个时候转出的操作已经执行完成,但是由于系统的故障,导致转入的操作失败了。那么怎么办?这就需要用到事务了,只要事务里面有一条命令未成功执行,那么数据就会回滚到事务开始之前的状态。

2.特性

(1) 原子性(Atomicity):事务是一个完整的操作, 事务中所有操作命令必须作为一个整体提交或回滚。如果事务中任何操作命令失败,则整个事务将因失败而回滚。

(2) 一致性(Consistency):当事务完成时,数据都处于一致状态。

(3) 隔离性(Isolation): 对数据进行修改的所有并发事务是彼此隔离的,它不以任何方式依赖或影响其他事务。

(4) 持久性(Durability):事务提交之后,数据是永久性的,不可再回滚。

3.操作:

(1) begin transaction:开始事务。

(2) commit transaction:提交事务。

(3) rollback transaction:回滚事务。

(4) save transaction:事务保存点。即事务回滚时,可以指定回滚到保存点,而不进行全部回滚。

4.分类:

(1) 显式事务:用 begin transaction 明确指定事务的开始,由 commit transaction 提交事务、rollback transaction 回滚事务到事务结束。

(2) 隐式事务:通过设置 set implicit_transactions on 语句,将隐式事务模式设置为打开。当以隐式事务模式操作时,不必使用 begin transaction 开启事务,当一个事务结束后,这个模式会自动启用下一个事务,只需使用 commit transaction 提交事务或 Rollback Transaction 回滚事务即可。

(3) 自动提交事务: 这是 SQL Server 的默认模式,它将每条单独的 T-SQL 语句视为一个事务。如果成功执行,则自动提交。如果错误,则自动回滚。

5.实例

先看一下数据:

begin tran        -- 开启事务,transcation 的简写
declare @errorNo int    --定义变量,用于记录事务执行过程中的错误次数
set @errorNo=0
begin try
    update Student set C_S_Id='2' where S_StuNo='003'
    set @errorNo=@errorNo+@@ERROR
    select 'S_StuNo=003 已经修改啦'

    update Student set C_S_Id='3' where S_StuNo='002' 
    set @errorNo=@errorNo+@@ERROR            -- @@ERROR 系统全局变量,记录错误次数,出现一次错误 @@ERROR 值+1
    select 'S_StuNo=002 已经修改啦'

    if(@errorNo>0)
    begin
        --抛出自定义的异常,在最后的catch块中统一处理异常
        RAISERROR(233333,16,3)
    end

end try
begin catch
    select ERROR_NUMBER() errorNumber,        --错误代码
           ERROR_SEVERITY() errorSeverity,    --错误严重级别,级别小于10 try catch 捕获不到
           ERROR_STATE() errorState,        --错误状态码
           ERROR_PROCEDURE() errorProcedure,    --出现错误的存储过程或触发器的名称
           ERROR_LINE() errorLine,        --发生错误的行号
           ERROR_MESSAGE() errorMessage        --错误的具体信息

    if(@@trancount>0)    -- @@trancount 系统全局变量,事务开启 @@trancount 值+1,判断事务是否开启
    begin
        rollback tran;        -- 回滚事务
    end
end catch

if(@@trancount>0)
begin
    commit tran;        -- 提交事务
end

select * from Student

这里由于外键约束的原因,所以第二条 update 语句导致失败,以上结果可以看出第一条数据肯定是执行过了,但是在 catch 语句里面回滚了,所以数据还是原来的状态。

现在只需要把第二条 update 语句 C_S_Id 列的值改为 5 即可。

 

  • 9
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值