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

新手(书上没有)写事务,请老师们帮忙
在各位老师的指导下,我把库里的4个触发器只保留一个,其余的操作用存储过程。
现在有两个存储过程A、B,
A:CREATE PROCEDURE [A]
(@ghsname [varchar](50),
@czyname [varchar](50))

AS INSERT INTO rkd
( [ghsname],
[czyname]) 
 
VALUES 
( @ghsname,
@czyname)
select SCOPE_IDENTITY( ) AS djh
return
GO
A操作完成后带回产生的djh,然后djh对应多条数据调用B存储过程插入另一个表
这两个存储过程都是一起执行的,但如果B存储过程操作失败的话,A已经完成。
现在我想把这两个存储过程放到一个事务里,如果哪条执行失败,自动回滚到事务执行之前的状态
难在这两个存储过程必须分开执行(因为在前台是A对应多条B,执行完A并返回djh之后,才能用djh加上许多新的参数才能循环执行n次B)。
SET XACT_ABORT on 
begin tran rk
A
B
commit tran rk
这样做行不行(A和B必须分开调用),如果正执行这个事务时突然断电,还能回滚到开始的状态吗?
在找的资料上看到事务有并发问题:1.丢失和覆盖更新;2.脏读;3.不可重复读;4.幻像读;
不明白是什么意思(资料上就说有这四个问题,没有继续说明。我的书上更别提了,连事务的这两个字都不知道,还是清华出版社的),我这个事务并发执行存在这样的问题吗?
最关键的是我现在根本不知道事务到底该写在SQL server 2000的什么地方?不会是在查询分析器里吧!!!

------解决方案--------------------
sql server 默认的事物级别好像是read committed,这个级别已经可以防止修改丢失和读脏数据了。
个人觉得这个够你用了。
------解决方案--------------------
探讨

引用:
AS
begin transaction
INSERT INTO rkd
VALUES ()
@j =@j+@@error

select SCOPE_IDENTITY( ) AS djh
return

if(@j>0)
begin
rollback
end
else
begin
commit
end
……

------解决方案--------------------
你眼神不对呢
结尾少了commit tran
需要再加那个?
if(@j>0)
begin
rollback
end
else
begin
commit
end
……