首页 > 解决方案 > CFLOCK:使用什么范围?

问题描述

我有一个为下一个事件生成令牌的函数。我们称之为 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的实现有问题吗?

标签: coldfusioncoldfusion-2016

解决方案


推荐阅读