sql 事务
发布网友
发布时间:2022-04-30 05:05
我来回答
共5个回答
热心网友
时间:2022-04-09 00:31
@@ERROR
如果前一个 Transact-SQL 语句执行没有错误,则返回 0。
看看你的存储过程.
理论上来说
update S_CELL
set AMOUNT=50 where PRODUCT_ID='10012' ---修改当前库存
与
update S_GATHER_DETAILS
set GATHER_TAG='K002-2' where PRODUCT_ID='10012' --修改入库状态
并不会发生错误 ( 通常情况下,如果数据库没问题的话。)
也就是说,那个 update 要出错。 要么就是 字段大小不对。
比如 GATHER_TAG 的数据类型为 varchar(2), 或者是 int
那么 update 操作, 是要出错了。
要么 你的 表里面有特殊的约束, 比如唯一约束
例如 GATHER_TAG 是 唯一的. 表里面已经有个 'K002-2'
那么 update 操作, 是要出错了。
如果 没有数据的话, 是不抱错的.
不知道你的数据库是 SQL 2000 ?
还是 SQL 2005/2008 的。
如果是后者, 可以尝试用 try / catch 的方式来处理。 省事,简单。
http://hi.baidu.com/wangqing999/blog/item/b2494d50cee15856d0090649.html
热心网友
时间:2022-04-09 01:49
这语句拿到查询分析器执行会报错吗,如果不会,那可能是下面这种情况
只有有出错的情况下才会回滚,如果值不存在(PRODUCT_ID='10012' )是不会出错的,只是受影响行数为0
可以这样判断
if @@rowcount=0 or @@error<>0
begin
set @err=@err+abs(@@error)+1
end
希望回答对你有帮助
热心网友
时间:2022-04-09 03:24
begin tran t1
.................
if @err<>0
rollback tran t1
end tran t1
--t1是事件名,自定义的
--if @err<>0 就回滚,否则不是Commit还能是什么?
--记住:有begin一定要有end
热心网友
时间:2022-04-09 05:15
感觉没什么错
set @err=@err+abs(@@error)
abs是啥没见过这样写的不知道行不行,我都直接写set @err=@err +@@error
热心网友
时间:2022-04-09 07:23
我平时是这样用的
if @@ERROR <> 0 or @@rowcount <> 1
begin
rollback tran
return
end
commit tran