事物及exec

事物3要出不多讲:

1.BEGIN TRANSACTION--开启事务

2.COMMIT TRANSACTION--事务执行

3.ROLLBACK TRANSACTION--事务回滚

俩总捕捉事物的方式

一:记录错误号:这种方式

1.这种方式的代码在错误发生后会一直执行下去。
ALTER PROC [dbo].[trans]
  @num NVARCHAR(20)
  AS
  BEGIN TRANSACTION--开启事务
   SELECT * FROM trantest(TABLOCKX)
   --动态执行语句
   DECLARE @sql NVARCHAR(200),@error INT
   SET @error=0
   PRINT ‘开始测试1‘
   --INSERT INTO trantest(num) values(@num)
   SET @sql=‘INSERT INTO trantest(num) values(@num)‘
   EXECUTE sp_executesql @sql,N‘@num nvarchar(20) ‘,@num
   SET @error[email protected][email protected]@error--接收错误号

   PRINT @error
   IF @error=0
   BEGIN
        PRINT ‘执行事务‘
        COMMIT TRANSACTION--事务执行
   END
   ELSE
   BEGIN
        PRINT ‘回滚事务‘
        ROLLBACK TRANSACTION--事务回滚
   END
GO

二:try catch 方式捕捉,这种方式

1.在发生错误后,会直接调整到catch语句,后面的语句就不再执行

CREATE PROC [dbo].[TryTrans]
  @num NVARCHAR(20)
  AS
        BEGIN TRANSACTION
          DECLARE @sql NVARCHAR(200),@error INT
        SET @error=0
  BEGIN TRY
        --动态执行语句

        PRINT ‘开始测试1‘
        --INSERT INTO trantest(num) values(@num)
        SET @sql=‘INSERT INTO trantest(num) values(@num)‘
        EXECUTE sp_executesql @sql,N‘@num nvarchar(20) ‘,@num
        PRINT ‘异常外‘

  END TRY
  BEGIN CATCH
        PRINT ‘出现异常,错误编号:‘ + convert(varchar,error_number()) + ‘,错误消息:‘ + error_message()
        SET @error = @error + 1
  END CATCH

IF(@error > 0)
    BEGIN
        --执行出错,回滚事务
        ROLLBACK TRAN;
        PRINT ‘转账失败,取消交易!‘;
    END
ELSE
    BEGIN
        --没有异常,提交事务
        COMMIT TRAN;
        PRINT ‘转账成功!‘;
    END

  GO

上面两种调用方式:EXEC trans @num=123456789011

上面2个语句都用到了exec动态执行语句,@@error为全局的,经过测试exec动态执行的错误号也都能捕捉到。

时间: 2024-10-24 13:00:16

事物及exec的相关文章

05-redis事物

可以一次性执行多个命令,本质是一组命令的集合,一个事物中的所有命令都会序列化,按顺序的串行化执行而不会被其他命令插入,不许加塞. 一个列队中,一次性.顺序性.排他性的执行一系列命令 . multi  开始一个事物块 exec 执行所有事物块内的命令 discard 取消事物 原文地址:https://www.cnblogs.com/xhrs/p/9384976.html

redis拾遗

自己边学边记录的,写在了excel里,这里直接沾出来,懒得美化加工了. 基础篇 命令 说明 redis命令是原子性的 键值类型数据 redis范围都是左开右开 set 设置值,如set s 1 范围若左0,右-1为全部 get 获取值,如get s 任意key的值都可用type判断类型 incr 让某个数值类型的key自增1,如incr s del 删除某个key,多key空格间隔,如del s b keys 查找某个(些)key,如keys s select 选择数据库,默认0,如:selec

redis入门笔记(2)

redis入门笔记(2) 上篇文章介绍了redis的基本情况和支持的数据类型,本篇文章将介绍redis持久化.主从复制.简单的事务支持及发布订阅功能. 持久化 •redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化,这是相对memcache来说的一个大的优势.redis支持两种持久化方式,一种是 Snapshotting(快照)也是默认方式,另一种是Append-only file(缩写aof)的方式. Snapshotting        快

java面试题目

1.项目中Spring AOP用在什么地方,为什么这么用,切点,织入,通知,用自己的话描述一下,AOP原理,动态代理2种实现. 主要是事务那方面,采用声明式的事务配置方式,是AOP给你封装好的. 通知: 定义:切面也需要完成工作.在 AOP 术语中,切面的工作被称为通知. 工作内容:通知定义了切面是什么以及何时使用.除了描述切面要完成的工作,通知还解决何时执行这个工作. Spring 切面可应用的 5 种通知类型: Before--在方法调用之前调用通知 After--在方法完成之后调用通知,无

redis限速器设计(不使用lua脚本及事物)

公司有一个需求,需要集群中的机器每分钟发送固定个数请求到局域网以外的一台服务器,固定个数,是指集群中的所有机器发送的所有的请求加起来是一个固定的个数,这就需要一个分布式的限速器. 首先想到的就是使用redis中的incr方法,在redis的官方文档中寻找到了一个示例 FUNCTION LIMIT_API_CALL(ip) ts = CURRENT_UNIX_TIME() keyname = ip+":"+ts current = GET(keyname) IF current != N

redis事物的使用

redis的几个事物命令: WATCH 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断:UNWATCH 取消 WATCH 命令对所有 key 的监视:MULTI 标记一个事务块的开始,指事务块内的多条命令会按照先后顺序被放进一个队列当中,最后由EXEC命令原子性(atomic)地执行:DISCARD 取消事务,放弃执行事务块内的所有命令:EXEC 执行所有事务块内的命令: phpredis的实现方式: 事务的调用有两种模式Redis::

Redis - 事物控制和发布订阅

multi命令后续命令将进入队列,不会马上执行,当执行exec后,一次输出所有结果 事物回滚使用discard命令,放弃之前的输入执行. SUBSCRIBE/PUBLISH SUBSCRIBE KEYWORD PUBLISH KEYWORD MESSAGE 主可以publish到从,从无法publish给主,从可以publish给从

python中执行字符串形式的语句和字符串形式的表达式方法(即exec和eval方法)

前阵子一直在思考一个问题,就是如何让用户在图形界面上输入的代码(输入的代码为字符串),成为代码的一部分而运行起来,恰逢看python爬虫的视频教程的时候,看到了使用eval函数,之后查找到了该文章,解决了我思考的问题. @文章来源:https://my.oschina.net/duhaizhang/blog/66048 Python有时需要动态的创造Python代码,然后将其作为语句执行  或  作为表达式计算. exec用于执行存储在字符串中的Python代码.   1. 语句与表达式的区别:

redis 事物

1正常执行 127.0.0.1:6379> multi     开启事物OK #然后进行相关操作127.0.0.1:6379> set key4 v4QUEUED127.0.0.1:6379> get key2QUEUED #提交127.0.0.1:6379> exec1) OK2) "v2" 2放弃事物127.0.0.1:6379> multiOK127.0.0.1:6379> set key7 eQUEUED127.0.0.1:6379>