Oracle函数并发

Oracle函数并发,第1张

概述我目前有一个INSERT TRIGGER,它在Oracle 10g中运行一个自定义函数,生成一个时髦的字母数字代码,用作插入的一部分. 我确实需要确保函数(甚至触发器)是线程安全的,这样如果两个用户一次激活触发器,触发器中使用的函数不会为两个用户返回相同的代码. 触发器中的流程如下: 开始 >确定我们是否需要继续基于业务逻辑 >运行自定义函数以获取新代码 >使用返回的代码作为插入到不同的表中 结束 我目前有一个INSERT TRIGGER,它在Oracle 10g中运行一个自定义函数,生成一个时髦的字母数字代码,用作插入的一部分.

我确实需要确保函数(甚至触发器)是线程安全的,这样如果两个用户一次激活触发器,触发器中使用的函数不会为两个用户返回相同的代码.

触发器中的流程如下:

开始

>确定我们是否需要继续基于业务逻辑
>运行自定义函数以获取新代码
>使用返回的代码作为插入到不同的表中

结束

主要问题是,当第2步运行时,一个单独的线程触发触发器,该触发器也进入第2步,并返回与第一个线程相同的代码. (我知道这是一个非常紧张的情况,但我们需要处理它).

我想到了两种主要的方法:

到目前为止,我想到的当前最好的方法是在触发器的最开始以“独占模式”锁定触发器中使用的表,并且不指定锁的NowAIT属性.这样,触发器的每个后续激活将使锁定“停止并等待”,从而等待其他线程完成触发.

我很乐意锁定表格,但我似乎无法在Oracle中找到如何做到这一点.

我的想法并不理想,但它应该有效,但是我希望听到任何可能有更好想法的人的意见!

非常感谢您给予的任何帮助.

干杯,
标记

解决方法 无需在此处制定排他性. Oracle通过管理您的事务来做到这一点.

关键是每次调用“自定义函数”都需要返回一个唯一的代码.

这意味着不使用系统日期/时间,而是使用其他东西来确保唯一性.

我推荐这个:

select sys_guID() from dual;

使用sys_guID()为你的函数加盐,所有都应该在触发器中.

请不要尝试使用此值更新其他表,否则您将需要处理变异表等.

编辑:显然,正如其他人提到的那样,使用触发器中的序列为您的函数设定种子是另一个很好的建议,因为Oracle强制执行唯一性.使用它作为种子可能​​会产生可预测的结果,因此如果“自定义函数”是密码重置或类似的东西,请小心.

总结

以上是内存溢出为你收集整理的Oracle函数并发全部内容,希望文章能够帮你解决Oracle函数并发所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1155802.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存