Coldfusion查询并将行分配给会话

时间:2014-03-21 23:39:24

标签: oracle coldfusion

我遇到了一个奇怪的要求,并且真的不知道从哪里开始

我们有一个oracle数据库表,它将每天接收数据,以及一个与之接口的CF应用程序

他们想要的是当用户登录时,从表中显示x行数,并基本上“锁定”该行的x行数,因此当另一个用户登录时,他们的x数量为行是不同的,所以没有人在同一行上同时工作

我猜测的是会话写入表格,声明行,但任何想法都会受到欢迎

1 个答案:

答案 0 :(得分:3)

有几种方法可以解决这个问题。我将在这里唠叨并告诉您,您将需要进入Oracle数据库程序并要求您了解锁定选择更新子句,您将沉浸在会话的细微差别以及它们如何在Oracle中工作,您将调用它使用cfstoredproc

还有另一种方法。现在我不知道您的编码环境或限制,也不知道用户/系统负载考虑因素,所以这只是一个建议。向表中添加一个标志字段并使其成为一个数据类型或int ...无论如何。您将在cfquery中选择它们,然后更新ID列表(设置bitItnFlag = 1 ...或任何您想要命名此新字段的任何内容),这意味着“此记录已签出”。您仍将在第一个查询中包含一组记录,您将循环到最终用户以处理需要更新查询,通过设置bitIntFlag = 0将其设置为空闲。他们将基本上被锁定。因此,另一个用户必须选择bitIntFlag = 0,其中主要是跳过锁定的组并设置他们选择的组(将它们更新为等于1)。您可以使用cftransaction和两个这样的cfqueries。

<cftransaction action"begin">
<cfquery name="selectLock" datasource="#application.dsn#">
SELECT  *
FROM    (
        SELECT  *
        FROM    mytable 
        WHERE bitIntFlag = 0
        ORDER BY
                dbms_random.value
        )
WHERE rownum <= 10 
</cfquery>
<!---Now run your update--->
<cftry>
<cfquery name="updateLock" datasource="#application.dsn#">
UPDATE
    myTable
SET
    bitIntFlag = 1
WHERE
   primaryKeyIDthing in #ValueList(selectLock.name)#
</cfquery>
<cfcatch type="database">
<cftransaction action="rollback"/>
</cfcatch>
<cftry>
<cftransaction action="commit"/>
</cftransaction>

<cfoutput query="selectLock">
#primaryKeyIDthing#<br>
</cfoutput>

(此代码未经测试,但如果沿着这条路线行驶,应该让你开始)

完成后,使用cfquery更新记录并运行更新sql并将标志设置为零以释放记录。

这也是一个简单的工作,可能会或可能不适合你。我不知道你在你的环境中处理什么样的交易强度,但有时简单的事情可以工作!