关于SQLSERVER 事物的运用(2)针对自定义错误的异常抛出的方案
2013-05-10 17:43
316 查看
1》@@rowCount的处理方式可如下
小结:还是利用goto err的方式进行处理,但是执行回滚必须加入判断条件判断是否还有活动的事物计数值,因为自定义的判断放在了事物的前面(避免事物过早的锁表),所以@@tranCount计数值为0,此时并不需要进行回滚
2》SET XACT_ABORT on的自定义错误的处理方式可如下
小结:原理同@@rowCount,不再赘述,区别在于SELECT 1/0后不用加入判断。实际上当发生1/0的错误时,估计是由SQL自身执行了ROLLBACK
TRAN
3》BEGIN TRY END TRY的自定义错误的处理方式可如下
小结: 条件判断的部分利用ERR标签进行直接的进行异常的抛出,语句更新的部分可以利用CATCH进行捕获,可以捕获到嵌套的存储过程错误等等,还是比较强大的。
第二部分的小结:
实现的方式都是差不多,利用标签,或是利用 CATCH,或是利用两者结合起来使用,没有什么很大的差异,CATCH方式中的标签ERR:是为自定义错服务的,所以放在了最外层,可不可以放在里面呢,也行,可以放在BEGIN
TRY里面,但判断条件也要放在BEGIN TRY里面,否则标签不能贯穿,有兴趣自己去整整,看看放在里面如何抛出自定义错误,如何又让CATCH捕获
Declare @err Varchar(300) /***************** 自定义的条件判断 *****************/ If 1=1 Begin select @err='您的单据未审核' goto err End /***************** 语句更删 *****************/ BEGIN TRAN SELECT 1/0 if @@ERROR>0 goto err INSERT INTO T_Test SELECT 12 COMMIT TRAN RETURN err: RAISERROR (@ERR,17, 1) if @@TRANCOUNT>0 rollback tran
小结:还是利用goto err的方式进行处理,但是执行回滚必须加入判断条件判断是否还有活动的事物计数值,因为自定义的判断放在了事物的前面(避免事物过早的锁表),所以@@tranCount计数值为0,此时并不需要进行回滚
2》SET XACT_ABORT on的自定义错误的处理方式可如下
Declare @err Varchar(300) Set XACT_ABORT On /***************** 自定义的条件判断 *****************/ If 1=2 Begin select @err='您的单据未审核' goto err End /***************** 语句更删 *****************/ BEGIN TRAN SELECT 1/0 INSERT INTO T_Test SELECT 12 COMMIT TRAN err: RAISERROR (@ERR,17, 1) if @@TRANCOUNT>0 rollback tran
小结:原理同@@rowCount,不再赘述,区别在于SELECT 1/0后不用加入判断。实际上当发生1/0的错误时,估计是由SQL自身执行了ROLLBACK
TRAN
3》BEGIN TRY END TRY的自定义错误的处理方式可如下
Declare @err Varchar(300) /***************** 自定义的条件判断 *****************/ If 1=2 Begin select @err='您的单据未审核' goto err End /***************** 语句更删 *****************/ BEGIN TRY BEGIN TRAN SELECT 1/0 INSERT INTO T_Test SELECT 12 COMMIT TRAN END TRY BEGIN CATCH SET @ERR =ERROR_MESSAGE() RAISERROR ( @ERR,17, 1) ROLLBACK TRAN END CATCH err: RAISERROR(@ERR,16, 1) --//自定义错误,外部捕获 if @@TRANCOUNT>0 rollback tran
小结: 条件判断的部分利用ERR标签进行直接的进行异常的抛出,语句更新的部分可以利用CATCH进行捕获,可以捕获到嵌套的存储过程错误等等,还是比较强大的。
第二部分的小结:
实现的方式都是差不多,利用标签,或是利用 CATCH,或是利用两者结合起来使用,没有什么很大的差异,CATCH方式中的标签ERR:是为自定义错服务的,所以放在了最外层,可不可以放在里面呢,也行,可以放在BEGIN
TRY里面,但判断条件也要放在BEGIN TRY里面,否则标签不能贯穿,有兴趣自己去整整,看看放在里面如何抛出自定义错误,如何又让CATCH捕获
相关文章推荐
- 关于SQLSERVER 事物的运用(3)嵌套事物以及嵌套存储过程的异常的处理
- 关于Tomcat启动项目时,控制台抛出各种异常,误以为项目错误
- 关于如何改变thinkphp中自定义的成功界面、错误界面、异常界面
- 关于SQLSERVER 事物的运用(1)普通事物
- 标准的EO验证提示错误不够完整,抛出自定义的异常。
- 错误处理: 从托管的 COM+ 服务器应用中抛出自定义异常类型
- 关于python3捕获cx_oracle抛出的异常错误
- [转载]针对IIS7以上的ASP.NET网站自定义错误页面与异常日志总结
- Intellij 代理抛出异常错误: java.rmi.server.ExportException: Port already in use: 1099,端口被占用
- 运用@Transactional,自己抛出异常时不会回滚的原因,经验之谈
- Java中异常抛出和自定义异常
- 出现“未报告的异常错误,必须对其进行捕获或声明以便抛出”的解决
- spring 事物异常回滚,捕获异常,不抛出就不会回滚
- 关于IE7打开任何网页弹出[未处理的异常('对象不支持此属性或方法')发生在iexplorer.exe]错误调试框的解决办法
- 关于异常的捕获与异常的抛出的详细例子
- PHP如何抛出异常处理错误
- 运用@Transactional,自己抛出异常时不会回滚的原因
- 关于对Map、List等集合操作抛出ConcurrentModificationException 异常问题
- android异常收集-关于导入文件出现错误,运行不起来