【发布时间】:2011-03-05 02:36:23
【问题描述】:
我有以下Coldfusion过程:
我的代码对 proc CommentInsert 进行了数据库调用(这会插入一条评论,然后调用一个事件插入 proc 关于正在添加的名为 EventInsert 的评论)
然后我调用 Event.GetEventByCommentId(commentId)
结果是没有记录返回,因为EventInsert还没有完成添加第1步中CommentInsert触发的事件记录。
我知道是这种情况,因为如果我在第 1 步和第 2 步之间创建了延迟,那么在第 2 步中将返回一个记录集。
这让我相信,在第 1 步中的事件插入提交之前,第 2 步中的读取发生得太快了。
我的问题是,如何告诉 Coldfusion 进程等到第 1 步完成后再进行第 2 步中的读取??
第一步和第二步是两个完全不同的方法。
代码:
<cfset MessageHandlerManager = AddComment(argumentCollection=arguments) />
<cfset qEvents = application.API.EventManager.GetEventFeed(commentId=MessageHandlerManager.GetReturnItems()) />
另外,让我补充一下,传递的 commentId 是有效的。我查过了。
另一种看待它的方式:
鉴于此代码:
<!--- Calls CommentInsert proc, which inserts a comment AND inserts an
event record by calling EventInsert within the proc --->
<cfset var newCommentId = AddComment(argumentCollection=arguments) />
<cfloop from="1" to="1000000" index="i">
</cfloop>
<!--- Gets the event record inserted in the code above --->
<cfset qEvent =
application.API.EventManager.GetEventFeed(commentId=newCommentId ) />
当我运行上面的代码时,qEvent 会返回一个有效的记录。 但是,当我注释掉循环时,记录又回来了 空。
我认为正在发生的是 CommentInsert 返回新的 注释 ID,但在调用 GetEventFeed 函数时, EventInsert proc 没有及时完成,没有找到记录。
因此,通过添加循环并延迟一点,事件插入有时间 完成,然后在 GetEventFeed 时返回有效记录 调用。
所以我的问题是,如何在不使用循环的情况下防止这种情况发生。
更新: 以下是使用的两个存储过程:
DELIMITER $$
DROP PROCEDURE IF EXISTS `CommentInsert` $$
CREATE DEFINER=`root`@`%` PROCEDURE `CommentInsert`(
IN _commentParentId bigint,
IN _commentObjectType int,
IN _commentObjectId bigint,
IN _commentText text,
IN _commentAuthorName varchar(100),
IN _commentAuthorEmail varchar(255),
IN _commentAuthorWebsite varchar(512),
IN _commentSubscribe tinyint(1),
IN _commentIsDisabled tinyint(1),
IN _commentIsActive tinyint(1),
IN _commentCSI int,
IN _commentCSD datetime,
IN _commentUSI int,
IN _commentUSD datetime,
OUT _commentIdOut bigint
)
BEGIN
DECLARE _commentId bigint default 0;
INSERT INTO comment
(
commentParentId,
commentObjectType,
commentObjectId,
commentText,
commentAuthorName,
commentAuthorEmail,
commentAuthorWebsite,
commentSubscribe,
commentIsDisabled,
commentIsActive,
commentCSI,
commentCSD,
commentUSI,
commentUSD
)
VALUES
(
_commentParentId,
_commentObjectType,
_commentObjectId,
_commentText,
_commentAuthorName,
_commentAuthorEmail,
_commentAuthorWebsite,
_commentSubscribe,
_commentIsDisabled,
_commentIsActive,
_commentCSI,
_commentCSD,
_commentUSI,
_commentUSD
);
SET _commentId = LAST_INSERT_ID();
CALL EventInsert(6, Now(), _commentId, _commentObjectType, _commentObjectId, null, null, 'Comment Added', 1, _commentCSI, Now(), _commentUSI, Now());
SELECT _commentId INTO _commentIdOut ;
END $$
DELIMITER ;
DELIMITER $$
DROP PROCEDURE IF EXISTS `EventInsert` $$
CREATE DEFINER=`root`@`%` PROCEDURE `EventInsert`(
IN _eventTypeId int,
IN _eventCreateDate datetime,
IN _eventObjectId bigint,
IN _eventAffectedObjectType1 int,
IN _eventAffectedObjectId1 bigint,
IN _eventAffectedObjectType2 int,
IN _eventAffectedObjectId2 bigint,
IN _eventText varchar(1024),
IN _eventIsActive tinyint,
IN _eventCSI int,
IN _eventCSD datetime,
IN _eventUSI int,
IN _eventUSD datetime
)
BEGIN
INSERT INTO event
(
eventTypeId,
eventCreateDate,
eventObjectId,
eventAffectedObjectType1,
eventAffectedObjectId1,
eventAffectedObjectType2,
eventAffectedObjectId2,
eventText,
eventIsActive,
eventCSI,
eventCSD,
eventUSI,
eventUSD
)
VALUES
(
_eventTypeId,
_eventCreateDate,
_eventObjectId,
_eventAffectedObjectType1,
_eventAffectedObjectId1,
_eventAffectedObjectType2,
_eventAffectedObjectId2,
_eventText,
_eventIsActive,
_eventCSI,
_eventCSD,
_eventUSI,
_eventUSD
);
END $$
DELIMITER ;
【问题讨论】:
-
你是否在不同的线程中运行这两个命令?
-
邮政编码以获得有用的答案。
-
我们还需要了解更多信息。 1. 你用的是什么数据库? 2. AddComment() 内部发生了什么?您是否使用 cfthread,您是否在数据库级别进行异步处理? 3. 怎么可能找回了有效身份证,却没有记录? AddComment 返回的 ID 是怎样的? 4. 您是否使用了任何类型的缓存,尤其是在 GetEventFeed 内部?
-
(1) MySQL (2) 调用存储过程,CommentInsert (3) 我得到一个 COMMENT ID,用于检索 EVENT 记录。那条记录是空白的。我的第一篇文章清楚地解释了 CommentInsert 过程调用 EventInsert 过程。 Id 通过调用 MessageHandlerManager.GetReturnItems() 返回,如代码所示。 (4) 无缓存。只是一个标准的 cfquery。
-
你能把GetEventFeed()的代码贴出来吗?
标签: coldfusion railo