请教高手:sql server中事务为什么没作用?

koukoujiayi 2007-02-10 04:24:14
请教高手:sql server中事务为什么没作用?
代码如下:
begin transaction
update table1
set name1='aaa' where id=1 --这个id不存在
if @@error<>0
ROLLBACK TRANSACTION
update table2 set name2='bbb' where id==2
if @@error<>0
ROLLBACK TRANSACTION
commit transaction

table1中id=1是不存在的,但table2始终能修改,根据事务原理,table2是不能修改的,为什么我这里能修改?百思不得其解!!是设置不对?
...全文
498 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
yitangliang 2007-04-29
  • 打赏
  • 举报
回复
楼主对事务的认识有偏差!建议再了解一下什么是事务!
m54772091 2007-04-04
  • 打赏
  • 举报
回复
baggio 写的每问题,有一点不好,如果期间发生错误,后面的还需要继续执行,当然最后会回滚。 最好的方法是,中间有问题,直接回滚,退出

如下

if @@error<>0 and @rowcount=0
begin rollack return end
koukoujiayi 2007-02-16
  • 打赏
  • 举报
回复
问题终于解决了,衷心感谢网友们给了我很多思路,特别感谢baggio高手!他的最终代码完全没问题!!衷心谢谢拉!!
todouwang 2007-02-15
  • 打赏
  • 举报
回复
begin transaction
update table1
set name1='aaa' where id=1 --这个id不存在
if @@rowCount<1 goto L1
update table2
set name2='bbb' where id=2
if @@rowCount<1 goto L1

commit transaction

L1:ROLLBACK TRANSACTION
baggio785 2007-02-15
  • 打赏
  • 举报
回复
写错了,把and改成or
baggio785 2007-02-15
  • 打赏
  • 举报
回复
begin transaction
declare @flag int
set @flag = 0
update table1
set name1='aaa' where id=1 --这个id不存在
if @@error<>0 and @rowcount=0
set @flag = 1
update table2 set name2='bbb' where id==2
if @@error<>0 and @rowcount=0
set @flag = 1
if @flag = 1
ROLLBACK TRANSACTION
else
commit transaction
koukoujiayi 2007-02-14
  • 打赏
  • 举报
回复
创建触发器太麻烦,就没有好的办法解决吗?
xie_yanke 2007-02-14
  • 打赏
  • 举报
回复
创建触发器.
koukoujiayi 2007-02-14
  • 打赏
  • 举报
回复
设置set xact_abort on也完全没作用!!
houyichong写的也不行!!
真是难啊!!
koukoujiayi 2007-02-11
  • 打赏
  • 举报
回复
谢谢诸位高手
问题是判断@@rowcount第二个表还是修改了,我希望的是如果第一个表没修改,第二个表也不应该修改。望高手指教,十分感谢!!拜托!!
zsl5305256 2007-02-11
  • 打赏
  • 举报
回复
没产生错误,@@error一直是为0;
@@rowcount
leihentulong 2007-02-11
  • 打赏
  • 举报
回复
if @@error<>0 and @@rowcount > 0
houyichong 2007-02-11
  • 打赏
  • 举报
回复
begin transaction
update table1
set name1='aaa' where id=1 --这个id不存在
update table2
set name2='bbb' where id==2
if @@error<>0
ROLLBACK TRANSACTION
else
commit transaction
这样不行吗?
OracleRoob 2007-02-11
  • 打赏
  • 举报
回复
update table1
set name1='aaa' where id=1 --这个id不存在
if @@error<>0

-------------------------------------

ID不存在,SQL语句执行也是成功的。

应该判断@@rowcount
zheninchangjiang 2007-02-11
  • 打赏
  • 举报
回复
use @@rowcount
if @@rowcount=0 or @@ERROR<>0
rollback
OracleRoob 2007-02-11
  • 打赏
  • 举报
回复
SET XACT_ABORT
指定当 Transact-SQL 语句产生运行时错误时,Microsoft SQL Server 是否自动回滚当前事务。

语法
SET XACT_ABORT { ON | OFF }

注释
当 SET XACT_ABORT 为 ON 时,如果 Transact-SQL 语句产生运行时错误,整个事务将终止并回滚。为 OFF 时,只回滚产生错误的 Transact-SQL 语句,而事务将继续进行处理。编译错误(如语法错误)不受 SET XACT_ABORT 的影响。

对于大多数 OLE DB 提供程序(包括 SQL Server),隐性或显式事务中的数据修改语句必须将 XACT_ABORT 设置为 ON。唯一不需要该选项的情况是提供程序支持嵌套事务时。有关更多信息,请参见分布式查询和分布式事务。

SET XACT_ABORT 的设置是在执行或运行时设置,而不是在分析时设置。
OracleRoob 2007-02-11
  • 打赏
  • 举报
回复
设置set xact_abort on即可。


set xact_abort on

begin tran
...
commit tran

return 0
chuifengde 2007-02-10
  • 打赏
  • 举报
回复
id不存在,但语句不产生错,@@error还是为0的,所以执行第二句

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧