关于数据库事务的使用!!!数据库使用使用者请进

来源:百度知道 编辑:UC知道 时间:2024/06/27 18:08:26
前几天自己动手编了一个存储过程。在数据库查询分析器中执行,执行过程中出了点问题,小弟大致说说,请各位高手解答一下。
大致是这样的。我这个存储过程用到了a,b,c,d,e 五个表。其中主要操作是,从a表中取数据,放到b表中,然后更新c表,更新d表,最后插入e表,删除a表,看起来很乱,不过问题点不在这些操作的正确性上。我把上述操作都放到一个事务当中。全部正确,才提交/ 我在测试的时候,故意事先删除d表,存储过程就发生错误。我理想的状态是各个表的数据都保持操作前状态。结果是
确实是数据都保持住,但用企业管理器却打不开上述几个表。不知道为什么。
我在每一个插入,更新操作后,都把@@error的值赋给@error变量,然后检查@error的值,如果不为零,就回滚,按理说不应该出问题啊!问题到底出在哪呢? 请各位解答一下,小弟不胜感激!!!
我简单补充一下,写了一个类似的存储过程:看看有什么错误
alter PROC PROC_StocksAdjust_AdjustBranchStocks
AS

DECLARE @ERROR AS int
SET @ERROR =0
BEGIN TRANSACTION
SELECT *
INTO #table1
FROM dbo.cache_sales_data002
SELECT @ERROR =@@ERROR IF @ERROR <>0 GOTO EXIT_PROC
INSERT INTO dbo.cache_sales_data003
SELECT * FROM dbo.cache_sales_data002
SELECT @ERROR =@@ERROR IF @ERROR <>0 GOTO EXIT_PROC
DELETE FROM dbo.cache_sales_data002
SELECT @ERROR =@@ERROR IF @ERROR <>0 GOTO EXIT_PROC
INSERT INTO dbo.cache_sales_data005<

其实楼主的想法是好的,不过存储过程中不用加GOTO,加上了也不会起作用。

在一个事务里如果执行多个操作,如果出现错误,事务会自动回滚,只不过有时候回滚的是整个事务,有时候回滚的是出现错误的操作步骤,这是要看出错的原因了。

解决的方法是在存储过程开始加上
SET XACT_ABORT ON
这样出错后整个事务都会回滚,也就不会锁住表了。