日期:2014-05-18  浏览次数:20555 次

关于存储过程事务问题
写了一个存储过程,用于确定是否更新数据,如果没有更新成功数据回滚。请指教是否正确,如果不正确,如何更改????

CREATE   PROCEDURE   WinUpdateUserInfo
@Account   varchar(30),
@OldPassword   varchar(30),
@NewPassword   varchar(30)

  AS

--Set   nocount   on

BEGIN   TRAN   Detail

UPDATE   WinUser   SET     Password=@NewPassword   WHERE   Account=@Account   AND   Password=@OldPassword

COMMIT   TRAN   InsertDetail--事务提交

IF   (@@error   <>   0) -- 事务回滚

BEGIN
ROLLBACK   TRANSACTION   Detail
RETURN   0
END
RETURN   1

GO




------解决方案--------------------
如果事务中只有一个SQL语句,加不加事务都没有关系,SQL Server中单个SQL语句就是一个隐性事务。

但是如果多个SQL语句,则格式类似如下:

--设置开关项,事务中任意一个SQL语句出错,都回滚整个事务
set xact_abort on

begin tran

...
...

commit tran


--如果发生严重错误,用(@@error <> 0)判断,系统根本就不会执行到这句


所以必须设置 set xact_abort on



------解决方案--------------------
--从mdb中获取数据

SELECT a.*
FROM OPENROWSET( 'Microsoft.Jet.OLEDB.4.0 ',
'c:\MSOffice\Access\Samples\northwind.mdb '; 'admin '; 'mypwd ', Orders)