我目前有一个 INSERT TRIGGER,它在 Oracle 10g 中运行一个自定义函数,该函数生成一个时髦的字母数字代码,用作插入的一部分。
我真的需要确保函数(甚至触发器)是线程安全的,这样如果两个用户同时激活触发器,触发器中使用的函数不会为两个用户返回相同的代码。
触发器中的流程如下:
开始
- 根据业务逻辑判断是否需要继续
- 运行自定义函数以获取新代码
- 使用返回的代码作为插入到不同的表中
结尾
主要问题是,如果在第 2 步运行时,一个单独的线程触发触发器,该触发器也进入第 2 步,并返回与第一个线程相同的代码。(我知道这是一个非常紧张的情况,但我们需要处理它)。
我想到了两种主要的方法:
目前我想到的目前最好的方法是在触发器一开始就以“独占模式”锁定触发器中使用的表,并且不指定锁的NOWAIT属性。这样,触发器的每个后续激活都会“停止并等待”锁可用,因此等待其他线程完成触发器。
我很想锁定表任何拒绝读取表,但我似乎可以找到如何在 Oracle 中执行此操作。
我的想法并不理想,但应该可行,但是我很想听听任何可能对此有更好想法的人!
非常感谢您提供的任何帮助。
干杯,马克