我有以下Coldfusion过程:
我的代码对proc的注释进行数据库调用(这会插入注释,然后调用关于正在添加的注释的事件插入proc,名为EventInsert)
然后我调用Event.GetEventByCommentId(commentId)
结果是没有返回记录,因为EventInsert尚未在步骤1中添加由CommentInsert触发的事件记录。
我知道情况就是这样,因为如果我在步骤1和步骤2之间创建了延迟,那么在步骤2中返回一个记录集IS。
这让我相信在步骤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 ;
答案 0 :(得分:1)
找到它。在EventManager.GetEventFeed查询中简化为此行:
AND eventCreateDate <= <cfqueryparam cfsqltype="cf_sql_timestamp" value="#Now()#" />
发生的事情是在EventInsert过程中调用的MySql Now()函数比查询中使用的Coldfusion #Now()#晚了一小部分。因此,代码行排除了该记录。此外,为什么只有在快速添加注释时才会发生这种情况。
什么是生物片。感谢大家的意见和建议。
答案 1 :(得分:0)
让我直截了当: 你调用一个MySQL SP,它执行一个插入,然后调用另一个SP来执行另一个插入。 这两者之间没有回归ColdFusion?是吗?
如果是这种情况,那么您的SP可能无法正确返回值,或者您在错误的位置查找结果。
我更倾向于使用MySQL SP出现问题。它们并不完美,并没有真正为您带来很多性能优势。视图很有用,但坦率地说,SP有点垃圾。我怀疑当你从第一个SP中调用第二个SP并且它返回一个值时,它没有被正确地从原始SP传递回ColdFusion,因此缺乏结果。
老实说,我的建议是在合适的DAO或服务中编写两个ORM函数或简单的cfqueries,以便首先记录插入注释的结果并返回一个值。返回该值后,再调用该函数以根据返回的注释ID获取事件。 (ColdFusion 8会给你Generated_Key,ColdFusion 9是生成的密钥,我不确定它在Railo中会是什么,但它会出现在“result”属性结构中)。
考虑到这一点,我甚至不确定你为什么要根据刚刚输入的纪念品来举办活动。您刚刚添加了针对某个事件的评论,因此您应该已经拥有该事件的一些数据,即使它只是您可以从中获取完整事件记录/对象的ID而无需通过评论绕过该房子
总而言之,我建议退一步看一下你正在使用的数据流,然后重构它。