• 全部
  • 基础类
  • 应用实例
  • 新技术前沿

不同数据库事务的问题

kafa 2008-03-24 09:37:10
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO

ALTER proc.dbo.DelData(@type varchar(50),@where varchar(8000))
As
/**//* ------- 事务开始 ---------- */
BEGIN TRANSACTION tran_test
if @type ='Vendition'
begin
--备份主表(Vendition_Data)
exec('insert into cang_back.dbo.vendition_data select * from vendition_data1 '+@where) --此处会出错
end
/**//*---------- 提交事务 ------------*/
COMMIT TRANSACTION tran_test

/**//*--------- 判断是否有错误 ----------*/
print @@ERROR
IF ( @@ERROR <> 0 )
BEGIN
/**//*---------- 自定义错误输出 ----------*/
RAISERROR( 'Insert data error!',16,1 )
/**//*-------- 事务回滚 --------*/
ROLLBACK TRANSACTION tran_test
select -1 as reuslt
END

/**//*------- 判断事务数是否大于0 -----------*/
IF ( @@TRANCOUNT > 0 )
BEGIN
/**//*-------- 事务回滚 --------*/
ROLLBACK TRANSACTION tran_test
select -1 as reuslt
END

select 1 as reuslt


GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO


明明exec('insert into cang_back.dbo.vendition_data select * from vendition_data1 '+@where) --此处会出错是有错误的,但为什么不会回滚事务呀?

@@ERROR为0

存储过程是在数据库1上面执行,要实现的效果为数据库1里的表里的数据转到数据库2
...全文
145 点赞 收藏 14
写回复
14 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
wzy_love_sly 2008-03-24
create table tb(s int)

BEGIN TRANSACTION
exec('insert into tb select 1')
exec('insert into tb select ''a''')
if @@error<>0
rollback TRANSACTION
else
COMMIT TRANSACTION

select * from tb


空结果
回复
kafa 2008-03-24
我实际的代码是这样的
exec('insert into cang_back.dbo.vendition_data select * from vendition_data '+@where)
--整机表
exec('insert into cang_back.dbo.Vendition_info select * from Vendition_info where d_NO in (select d_NO from vendition_data '+@where+' and substring(d_NO,1,1)=''A'')')
exec('insert into cang_back.dbo.Vendition_Fittings_Detail select * from Vendition_Fittings_Detail where s_code in (select d_NO from vendition_data '+@where+' and substring(d_NO,1,1)=''A'')') --如果是在这里出错的话,前面两个是正确的,会执行成功,就只有这条没有执行成功
回复
-晴天 2008-03-24
那,似乎该这么写:

/**//* ------- 事务开始 ---------- */
BEGIN TRANSACTION tran_test
if @type ='Vendition'
begin
--备份主表(Vendition_Data)
exec('insert into cang_back.dbo.vendition_data select * from vendition_data1 '+@where) --此处会出错
end

/**//*--------- 判断是否有错误 ----------*/
IF ( @@ERROR <> 0 )
BEGIN
/**//*---------- 自定义错误输出 ----------*/
RAISERROR( 'Insert data error!',16,1 )
/**//*-------- 事务回滚 --------*/
ROLLBACK TRANSACTION tran_test
select -1 as reuslt
end
else
/**//*---------- 提交事务 ------------*/
COMMIT TRANSACTION tran_test
END


回复
-晴天 2008-03-24
/**//* ------- 事务开始 ---------- */
BEGIN TRANSACTION tran_test
if @type ='Vendition'
begin
--备份主表(Vendition_Data)
exec('insert into cang_back.dbo.vendition_data select * from vendition_data1 '+@where) --此处会出错
end
/**//*---------- 提交事务 ------------*/
COMMIT TRANSACTION tran_test

从这段话,看不出在执行错误语句前对数据库有什么操作.
回复
kafa 2008-03-24
在事务中,出错时还没对数据库进行操作呢,回滚什么?

在出错时就已有操作了呀,如前两行sql语句没有问题,只是第三条有问题,那么就只有第三条没有执行成功,其它都执行成功了,数据也转过去了,但我需要的是只要有一条语句有错误就全部都不执行
回复
-晴天 2008-03-24
回滚是指在一介事务中同时执行了多个操作,其中一个操作出错,那么其他操作都会被取消,数据库回到执行事务前的状态.
而且,事务的出错处理操作必须写在同一个事务中,而且,事务的错误处理程序必须写在同一个事务中,也就是说在事务中要注明什么情况下要回滚,什么情况下不要回滚.你把它分成了两个事务来处理是不对的.
回复
-晴天 2008-03-24
在事务中,出错时还没对数据库进行操作呢,回滚什么?
你又有了错误处理程序,事务中又没别的东东,服务器当然就这么过去了.
回复
kafa 2008-03-24
exec('insert into cang_back.dbo.vendition_data select * from vendition_data1 where '+@where) ;
这样是不会有问题

其实我是故意将vendition_data改为vendition_data1,因为vendition_data1是不存在的,我在测试如果在用exec执行时如果发生错误人示会回滚,我要实现的效果就是,在多个exec执行时只要有行出错就回滚事务
回复
youngerch 2008-03-24
exec('insert into cang_back.dbo.vendition_data select * from vendition_data1 where '+@where) ;
我猜想是你给的@where条件里不符合语法
回复
youngerch 2008-03-24
[Quote=引用 3 楼 kafa 的回复:]
这样在+@where

第 11 行: '+' 附近有语法错误。

提示这个错误的噢
[/Quote]

是这行的语句有错误
回复
kafa 2008-03-24
to wzy_love_sly :我按你的做法,但这样不行噢,如果要执行三条sql语句时,第二条或第三前出问题,那么前面的没有问题的sql语句人执行成功并没有回滚
回复
kafa 2008-03-24
这样在+@where

第 11 行: '+' 附近有语法错误。

提示这个错误的噢
回复
wzy_love_sly 2008-03-24
BEGIN   TRANSACTION  tran_test
if @type ='Vendition'
begin
--备份主表(Vendition_Data)
exec('insert into cang_back.dbo.vendition_data select * from vendition_data1 '+@where) --此处会出错
end
/**//*---------- 提交事务 ------------*/
if @@error<>0
rollback TRANSACTION tran_test
else
COMMIT TRANSACTION tran_test


也许错误的级别不高,所以没有回滚
回复
youngerch 2008-03-24
begin
--备份主表(Vendition_Data)
exec('insert into cang_back.dbo.vendition_data select * from vendition_data1 '+@where) --此处会出错
end

exec('insert into cang_back.dbo.vendition_data select * from vendition_data1 '+@where) -->
insert into cang_back.dbo.vendition_data select * from vendition_data1 + @where;试试
回复
相关推荐
发帖
MS-SQL Server
创建于2007-09-28

3.3w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2008-03-24 09:37
社区公告
暂无公告