存储过程中事务未启用

__lhy 2014-03-07 11:14:22
存储过程中:
begin tran
delete from XX where yy='1'
delete from ZZ where aa=(select [A] from [B] where C=5)
...
commit tran

结果执行后
delete from XX where yy='1'--执行成功了
delete from ZZ where aa=(select [A] from [B] where C=5)子查询不止返回一个 删除出错

这样事务是不是没有生效? 还有“子查询不止返回一个 ”删除错误?
...全文
86 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
__lhy 2014-03-07
  • 打赏
  • 举报
回复
引用 12 楼 ap0405140 的回复:
要自动回滚全部操作需先执行set xact_abort on

set xact_abort on

begin tran

 delete from XX where yy='1'
   
 delete from ZZ where aa in(select [A] from [B] where C=5)

commit tran
谢谢 是需要设置这个标志
唐诗三百首 2014-03-07
  • 打赏
  • 举报
回复
事务开始前,set xact_abort on即可, 参考http://msdn.microsoft.com/zh-tw/library/ms188792(v=sql.105).aspx
發糞塗牆 2014-03-07
  • 打赏
  • 举报
回复
引用 14 楼 qq752923276 的回复:
[quote=引用 11 楼 DBA_Huangzj 的回复:] 简单演示一下,因为你用了单纯的commit,所以建议使用更完善的错误控制
--CREATE TABLE test(id INT,NAME VARCHAR(10))
--INSERT INTO test
--SELECT 1,'a'
--UNION ALL 
--SELECT 2,'b'
--UNION ALL 
--SELECT 3,'c'


SELECT * FROM test

BEGIN TRAN 
DELETE FROM test WHERE id=1
DELETE FROM test WHERE id =(SELECT 1 id UNION ALL SELECT 2 )
IF @@ERROR >0
ROLLBACK 
ELSE 
COMMIT ;

SELECT * FROM test
/*
id          NAME
----------- ----------
1           a
2           b
3           c

(3 row(s) affected)


(1 row(s) affected)
Msg 512, Level 16, State 1, Line 14
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
The statement has been terminated.
id          NAME
----------- ----------
1           a
2           b
3           c
*/
谢谢 还是无法避免这种情况 事务中第一条语句执行出错 后面的语句执行成功了 这样@@error还是会被置0 [/quote]演示而已,实际上@@error是上一条语句的状态,所以用处不大,要么用set xact_abort on 要么用try/catch
__lhy 2014-03-07
  • 打赏
  • 举报
回复
引用 11 楼 DBA_Huangzj 的回复:
简单演示一下,因为你用了单纯的commit,所以建议使用更完善的错误控制
--CREATE TABLE test(id INT,NAME VARCHAR(10))
--INSERT INTO test
--SELECT 1,'a'
--UNION ALL 
--SELECT 2,'b'
--UNION ALL 
--SELECT 3,'c'


SELECT * FROM test

BEGIN TRAN 
DELETE FROM test WHERE id=1
DELETE FROM test WHERE id =(SELECT 1 id UNION ALL SELECT 2 )
IF @@ERROR >0
ROLLBACK 
ELSE 
COMMIT ;

SELECT * FROM test
/*
id          NAME
----------- ----------
1           a
2           b
3           c

(3 row(s) affected)


(1 row(s) affected)
Msg 512, Level 16, State 1, Line 14
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
The statement has been terminated.
id          NAME
----------- ----------
1           a
2           b
3           c
*/
谢谢 还是无法避免这种情况 事务中第一条语句执行出错 后面的语句执行成功了 这样@@error还是会被置0
發糞塗牆 2014-03-07
  • 打赏
  • 举报
回复
最好使用try/catch来捕获错误然后回滚
唐诗三百首 2014-03-07
  • 打赏
  • 举报
回复
要自动回滚全部操作需先执行set xact_abort on

set xact_abort on

begin tran

 delete from XX where yy='1'
   
 delete from ZZ where aa in(select [A] from [B] where C=5)

commit tran
發糞塗牆 2014-03-07
  • 打赏
  • 举报
回复
简单演示一下,因为你用了单纯的commit,所以建议使用更完善的错误控制
--CREATE TABLE test(id INT,NAME VARCHAR(10))
--INSERT INTO test
--SELECT 1,'a'
--UNION ALL 
--SELECT 2,'b'
--UNION ALL 
--SELECT 3,'c'


SELECT * FROM test

BEGIN TRAN 
DELETE FROM test WHERE id=1
DELETE FROM test WHERE id =(SELECT 1 id UNION ALL SELECT 2 )
IF @@ERROR >0
ROLLBACK 
ELSE 
COMMIT ;

SELECT * FROM test
/*
id          NAME
----------- ----------
1           a
2           b
3           c

(3 row(s) affected)


(1 row(s) affected)
Msg 512, Level 16, State 1, Line 14
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
The statement has been terminated.
id          NAME
----------- ----------
1           a
2           b
3           c
*/
__lhy 2014-03-07
  • 打赏
  • 举报
回复
引用 8 楼 DBA_Huangzj 的回复:
[quote=引用 6 楼 qq752923276 的回复:] [quote=引用 4 楼 qq752923276 的回复:] [quote=引用 1 楼 DBA_Huangzj 的回复:] 你这个会全部回滚, delete from ZZ where aa=(select [A] from [B] where C=5) 改成: delete from ZZ where exists (select 1 from (select a from [b] where c=5) b where zz.aa=b.a)试试
谢谢 就是没有回滚 能删除的成功了 不能删除的还是保留在数据表中[/quote] 事务应该要不全部执行 要不全部不执行的吧?[/quote]对,前提你没有嵌套事务[/quote] 可以避免或者检测嵌套事务吗?
__lhy 2014-03-07
  • 打赏
  • 举报
回复
引用 5 楼 DBA_Huangzj 的回复:
其实有没有生效,查一下数据就知道了
查了数据的
發糞塗牆 2014-03-07
  • 打赏
  • 举报
回复
引用 6 楼 qq752923276 的回复:
[quote=引用 4 楼 qq752923276 的回复:] [quote=引用 1 楼 DBA_Huangzj 的回复:] 你这个会全部回滚, delete from ZZ where aa=(select [A] from [B] where C=5) 改成: delete from ZZ where exists (select 1 from (select a from [b] where c=5) b where zz.aa=b.a)试试
谢谢 就是没有回滚 能删除的成功了 不能删除的还是保留在数据表中[/quote] 事务应该要不全部执行 要不全部不执行的吧?[/quote]对,前提你没有嵌套事务
發糞塗牆 2014-03-07
  • 打赏
  • 举报
回复
你没有嵌套事务吧?
引用 4 楼 qq752923276 的回复:
[quote=引用 1 楼 DBA_Huangzj 的回复:] 你这个会全部回滚, delete from ZZ where aa=(select [A] from [B] where C=5) 改成: delete from ZZ where exists (select 1 from (select a from [b] where c=5) b where zz.aa=b.a)试试
谢谢 就是没有回滚 能删除的成功了 不能删除的还是保留在数据表中[/quote]
__lhy 2014-03-07
  • 打赏
  • 举报
回复
引用 4 楼 qq752923276 的回复:
[quote=引用 1 楼 DBA_Huangzj 的回复:] 你这个会全部回滚, delete from ZZ where aa=(select [A] from [B] where C=5) 改成: delete from ZZ where exists (select 1 from (select a from [b] where c=5) b where zz.aa=b.a)试试
谢谢 就是没有回滚 能删除的成功了 不能删除的还是保留在数据表中[/quote] 事务应该要不全部执行 要不全部不执行的吧?
發糞塗牆 2014-03-07
  • 打赏
  • 举报
回复
其实有没有生效,查一下数据就知道了
__lhy 2014-03-07
  • 打赏
  • 举报
回复
引用 1 楼 DBA_Huangzj 的回复:
你这个会全部回滚, delete from ZZ where aa=(select [A] from [B] where C=5) 改成: delete from ZZ where exists (select 1 from (select a from [b] where c=5) b where zz.aa=b.a)试试
谢谢 就是没有回滚 能删除的成功了 不能删除的还是保留在数据表中
發糞塗牆 2014-03-07
  • 打赏
  • 举报
回复
in或者exists都可以,由于你是显式定义事务,应该会回滚的,不过建议对这些东西还是要加上一些try/catch监控比较保险
__lhy 2014-03-07
  • 打赏
  • 举报
回复
引用 楼主 qq752923276 的回复:
存储过程中: begin tran delete from XX where yy='1' delete from ZZ where aa=(select [A] from [B] where C=5) ... commit tran 结果执行后 delete from XX where yy='1'--执行成功了 delete from ZZ where aa=(select [A] from [B] where C=5)子查询不止返回一个 删除出错 这样事务是不是没有生效? 还有“子查询不止返回一个 ”删除错误?
子查询不止返回一个 ”删除错误 这个解决了 不能使用= 应该使用in
發糞塗牆 2014-03-07
  • 打赏
  • 举报
回复
你这个会全部回滚, delete from ZZ where aa=(select [A] from [B] where C=5) 改成: delete from ZZ where exists (select 1 from (select a from [b] where c=5) b where zz.aa=b.a)试试

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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