MS SERVER 2K 的触发器中的事务处理问题(只有20分)(20分)

  • 主题发起人 主题发起人 HON
  • 开始时间 开始时间
H

HON

Unregistered / Unconfirmed
GUEST, unregistred user!
在MS SERVER 2K 的凭证明细表触发器(INSERT,DELETED,UPDATE)中的设置事务处理:
开始BEGIN TRANSACTION
通不过审核时ROLLBACK TRANSACTION
通过则 COMMIT TRANSACTION

但运行出现错误: ROLLBACK TRANSACTION 请求没有对应的BEGIN TRANSACTION
不知何故?
 
但运行出现错误: EDBENGINERROR WITH MESSAGE'NO USER TRANSACTION IS CURRENCLY IN PROGRESS,
ROLLBACK TRANSACTION 请求没有对应的BEGIN TRANSACTION
不知何故?
 
怎么没人答,分不够,可不可以贷?
 
MLZHOU等DFW你们去哪了?

SOS
 
你不需要用begin tran进行一个事务,因为触发器本身就是一个事务,只要当条件不满足时,用rooback tran,
满足条件是用commit tran就行了。
 
在DELHI5。0运行出现错误: EDBENGINERROR WITH MESSAGE'NO USER TRANSACTION IS CURRENCLY IN PROGRESS,
COMMIT TRANSACTION 请求没有对应的BEGIN TRANSACTION
 
这个问题确实有点难回答,不是问题本身,大伙说对不对,而是你的问题描述的不清楚.
有几种可能,一是你的后台DBMS里多了一个COMMIT TRANS,再有就是你的前台DELPHI里
没起用BEGIN TRANS,或者也是多了一个COMMIT TRANS,你可以通过DBMS的事件查看器
一行行检查一下.
 
不用begin tran试试
 
不是已经告诉你了吗?你有没有试试啊:
你不需要用begin tran进行一个事务,因为触发器本身就是一个事务,只要当条件不满足时,用rooback tran,
满足条件是用commit tran就行了。
 
TO:JEERYJEAN
按你的办法试过,还是出现同样错误,EDBENGINERROR WITH MESSAGE'NO USER TRANSACTION IS CURRENCLY IN PROGRESS,
COMMIT TRANSACTION 请求没有对应的BEGIN TRANSACTION

但在企业管理器中可以,(不论是否有加BEGINTRANSACTION)
代码如下(只是为了试试事务管理是怎么回事,前台用缓存提交,
触发器不加事务时完全可以通过,加了出问题),请各位诊断一下.



CREATE TRIGGER ut_GoodInDetail_UDI ON InStoreDetail FOR DELETE , INSERT , UPDATE AS

BEGIN

DECLARE @INO_I VARCHAR (12) , @IGOODSNO_I INT , @ISTORENO_I INT , @FQUANTITY_I Numeric (8,2)
DECLARE @INO_D VARCHAR (12) , @IGOODSNO_D INT , @ISTORENO_D INT , @FQUANTITY_D Numeric (8,2)
DECLARE @HON1 VARCHAR(20)

SELECT @HON1='MYTRANSACTION'
SET NOCOUNT ON
UPDATE Storage Set fQuantity = 0 WHERE fQuantity IS NULL

/*BEGIN TRANSACTION mytransaction
触发器起名无效*/

/* BEGIN TRANSACTION*/
DECLARE DELETED_CURSOR CURSOR FOR
SELECT INO , IGoodsNo , fQuantity FROM DELETED;
OPEN DELETED_CURSOR

FETCH NEXT FROM DELETED_CURSOR INTO @INO_D , @IGOODSNO_D , @FQUANTITY_D
WHILE @@FETCH_STATUS = 0
BEGIN
SET @ISTORENO_D = ( SELECT iStore FROM InStoreMaster WHERE INO = @INO_D )
IF EXISTS(SELECT * FROM Storage WHERE iStoreNo = @ISTORENO_D AND IGoodsNo = @IGOODSNO_D)
BEGIN
UPDATE Storage Set fQuantity = fQuantity - @FQUANTITY_D WHERE iStoreNo = @ISTORENO_D AND IGoodsNo = @IGOODSNO_D
/* RAISERROR ('触发器提示: 数据库更新 [凭证] 资料失败, 请确认 [单据编号] 为 %s 所对应的 [凭证] 是否存在', 16, 1, @INO_D)*/
ROLLBACK TRANSACTION
SET NOCOUNT OFF
RETURN

END
ELSE
BEGIN
RAISERROR ('触发器提示: 数据库更新 [凭证] 资料失败, 请确认 [单据编号] 为 %s 所对应的 [凭证] 是否存在', 16, 1, @INO_D)
ROLLBACK TRANSACTION
RETURN

INSERT INTO Storage (iStoreNo , iGoodsNo , fQuantity ) VALUES ( @ISTORENO_D , @IGOODSNO_D , - @FQUANTITY_D )
END
FETCH NEXT FROM DELETED_CURSOR INTO @INO_D , @IGOODSNO_D , @FQUANTITY_D

END
CLOSE DELETED_CURSOR
DEALLOCATE DELETED_CURSOR

DECLARE INSERTED_CURSOR CURSOR FOR
SELECT INO , IGoodsNo , fQuantity FROM INSERTED;
OPEN INSERTED_CURSOR
FETCH NEXT FROM INSERTED_CURSOR INTO @INO_I , @IGOODSNO_I , @FQUANTITY_I
WHILE @@FETCH_STATUS = 0
BEGIN
SET @ISTORENO_I = ( SELECT iStore FROM InStoreMaster WHERE INO = @INO_I )
IF EXISTS(SELECT * FROM Storage WHERE iStoreNo = @ISTORENO_I AND IGoodsNo = @IGOODSNO_I)
BEGIN
/* RAISERROR ('触发器提示: 数据库更新 [凭证] 资料失败, 请确认 [单据编号] 为 %s 所对应的 [凭证] 是否存在', 16, 1, @INO_D)*/
UPDATE Storage Set fQuantity = fQuantity + @FQUANTITY_I WHERE iStoreNo = @ISTORENO_I AND IGoodsNo = @IGOODSNO_I
END
ELSE
INSERT INTO Storage (iStoreNo , iGoodsNo , fQuantity ) VALUES ( @ISTORENO_I , @IGOODSNO_I , @FQUANTITY_I )
FETCH NEXT FROM INSERTED_CURSOR INTO @INO_I , @IGOODSNO_I , @FQUANTITY_I
END
CLOSE INSERTED_CURSOR
DEALLOCATE INSERTED_CURSOR
DELETE FROM Storage WHERE fQuantity = 0
COMMIT TRANSACTION
/*SET NOCOUNT OFF*/
END











 
to HON:
你用set implicit_transaction off 试试
 
jerryjean:
加在哪?
 
你使用的是ADO方式吗,如果是,请查看一下你所使用的数据集的属性设置组合是否正确:
Cursorlocation CursorType LockType等,以及你保存数据时调用哪个对应的数据集方法
我原来曾对此做过不同方式的测试,好像碰到过类似的错误
 
wqxsdly:
用bde,用缓存提交方法,用触发器主要是为了核算,并向前台提示结果
 
我看你程序把BEGIN TRANSACTION 注释掉了
 
有无 BEGIN TRANSATION 没有关系
 
怎么没有关系???
没有BEGIN TRANSATION ,事务没开始。
怎么ROLLBACK TRANSACTION 回滚事务.怎么COMMIT TRANSACTION 提交事务
 
有无 BEGIN TRANSATION 结果都一样:
在企业管理器中可以,在DELPHI 中不行,错误信息一样。
 
能不能把相关的几个数据库结构贴出来?对着结构里的字段,把你的要求说明白点。我看了看你的
触发器,明白你的意思有点困难。贴出来看看?
 
后退
顶部