我的编程空间,编程开发者的网络收藏夹
学习永远不晚

sqlserver中存储过程事务处理常见问题

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

sqlserver中存储过程事务处理常见问题

在编写SQL Server 事务相关的存储过程代码时,经常看到下面这样的写法:

begin tran
update statement 1 ...
update statement 2 ...
delete statement 3 ...
insert statement 4 ...
commit tran

这样编写的SQL存在很大隐患。请看下面的例子:

create table demo(id int not null)
go
begin tran
insert into demo values (null)
insert into demo values (2)
commit tran
go

执行时会出现一个违反not null 约束的错误信息,但随后又提示(1 row(s) affected)。 我们执行select * from demo 后发现insert into demo values(2) 却执行成功了。 这是什么原因呢? 
原来 SQL Server在发生runtime 错误时,默认会rollback引起错误的语句,而继续执行后续语句。
如何避免这样的问题呢?有三种方法:
1. 在事务语句最前面加上set xact_abort on

set xact_abort on
begin tran
update statement 1 ...
update statement 2 ...
delete statement 3 ...
commit tran
go

当xact_abort 选项为on 时,SQL Server在遇到错误时会终止执行并rollback 整个事务。
2. 在每个单独的DML语句执行后,立即判断执行状态,并做相应处理。

begin tran
update statement 1 ...
if @@error <> 0
begin rollback tran
goto labend
end
delete statement 2 ...
if @@error <> 0
begin rollback tran
goto labend
end
commit tran
labend:
go

在SQL Server 2005中,可利用 try...catch 异常处理机制。

begin tran
begin try
update statement 1 ...
delete statement 2 ...
endtry
begin catch
if @@trancount > 0
rollback tran
end catch
if @@trancount > 0
commit tran
go

 

下面是个简单的存储过程,演示事务处理过程。

create procedure dbo.pr_tran_inproc as begin set nocount on
begin tran
update statement 1 ...
if @@error <> 0
begin rollback tran
return -1 end
delete statement 2 ...
if @@error <> 0
begin rollback tran
return -1
end commit tran
return 0
end
go

 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

sqlserver中存储过程事务处理常见问题

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

sqlserver中存储过程事务处理常见问题

在编写SQL Server 事务相关的存储过程代码时,经常看到下面这样的写法: begin tranupdate statement 1 ...update statement 2 ...delete statement 3 ...insert stateme
2020-12-03

SqlServer存储过程中使用事务,示例模版

create proc pro_GetProTrans@GoodsId int,@Number int,@StockPrice money,@SupplierId int,@EmpId int,@StockUnit varchar(50),@StockDate
SqlServer存储过程中使用事务,示例模版
2018-03-13

MySQL中事务处理的常见问题和解决方案

MySQL中事务处理的常见问题和解决方案在数据库操作中,事务处理是非常重要的,它可以确保数据库操作的一致性和完整性。然而,在MySQL中进行事务处理时,常常会遇到一些问题。本文将介绍常见的MySQL事务处理问题,并提供相应的解决方案。问题一
2023-10-22

Java调用存储过程事务问题怎么解决

在Java中调用存储过程时,可以使用JDBC提供的事务管理功能来解决事务问题。以下是解决事务问题的一般步骤:1. 创建数据库连接:使用JDBC创建与数据库的连接。2. 开始事务:通过调用连接对象的setAutoCommit(false)方法
2023-10-24

Java调用存储过程事务问题怎么解决

在Java中调用存储过程时,要确保事务的原子性,防止数据不一致,可使用显式事务控制。禁用自动提交,使用PreparedStatement设定参数,执行存储过程后,根据结果提交或回滚事务。这种方法确保数据一致性和安全性,但会增加代码复杂性,并在特殊情况下需要JDBC批处理或存储过程批量更新以提高性能。
Java调用存储过程事务问题怎么解决
2024-04-10

PHP PDO高级技巧:使用存储过程和事务处理

PHP PDO 存储过程 事务处理 在PHP中使用PDO扩展连接数据库时,除了基本的查询和更新操作外,还可以使用存储过程和事务处理来提高代码的可读性和效率。
PHP PDO高级技巧:使用存储过程和事务处理
2024-02-13

存储过程循环对MySQL事务处理有哪些影响

存储过程循环对MySQL事务处理可能会产生一些影响,包括:循环中的每一次迭代都会被视为一个独立的事务。如果在循环中发生错误,可能会导致部分操作被回滚,而其他操作则已经提交,导致数据不一致的情况。循环中的大量操作可能会增加数据库的负担,导致
存储过程循环对MySQL事务处理有哪些影响
2024-04-30

C#中常见的数据库连接和事务处理问题及解决方法

C#中常见的数据库连接和事务处理问题及解决方法摘要:随着互联网和信息技术的飞速发展,数据库的使用越来越广泛。作为开发人员,在编写应用程序时,数据库连接和事务处理是必不可少的部分。然而,由于各种原因,可能会出现一些常见的问题。本文将详细介绍C
2023-10-22

Excel数据导入Mysql常见问题汇总:如何处理导入数据过程中的冲突问题?

Excel数据导入Mysql常见问题汇总:如何处理导入数据过程中的冲突问题?导入数据是我们在实际工作中常常需要处理的任务之一,而Excel作为一种常见的数据源,往往用于导入数据到Mysql数据库中。然而,在数据导入的过程中,我们常常会遇到各
2023-10-22

Excel数据导入Mysql常见问题汇总:如何处理导入过程中的重复数据?

Excel数据导入Mysql常见问题汇总:如何处理导入过程中的重复数据?在数据处理的过程中,我们常常会遇到Excel数据导入到Mysql数据库的需求。然而,由于数据量庞大,很容易出现重复数据的情况,这就需要我们在导入过程中进行相应的处理。在
2023-10-22

PostgreSQL 存储过程的进阶讲解(含游标、错误处理、自定义函数、事务)

目录介绍游标错误处理报告错误和信息检查断言捕获异常自定义函数存储过程事务管理介绍上一篇我编程客栈们讲解了PostgreSQL 存储过程的基本入门,满足一些最简单的使用,本章介绍相对复杂的使用方式。游标PL/pgSQL 游标允许我们封
2023-03-20

编程热搜

目录