我有一个为下一个事件生成令牌的函数。我们称这个eventID。这是数字形式,但由于业务原因而存储为varchar。可以从应用程序中的多个位置调用此函数,并且为了避免争用条件,以避免为不同的用户生成相同的ID,添加了应用程序范围锁。但是在少数情况下,仍会为2个不同的事件生成相同的ID。
<cffunction name="getEventID" returntype="string">
<cfset var newID = "">
<cflock scope="Application" timeout="5" throwontimeout="true">
<cfquery name="qry" datasource="#DSN#">
SELECT TOP 1 CONVERT(int, eventID) AS eventID
FROM events WHERE ISNUMERIC(eventID) = 1
ORDER BY CONVERT(int, eventID) DESC
</cfquery>
<cfset newID = qry.eventID + 1>
</cflock>
<cfreturn newID>
</cffunction>
CFLOCK的实现是否有问题?