0

这就是我的要求 - 锁定数据库记录,处理它并释放它

环境 - weblogic 10.3 数据库 - Oracle 11g 数据源 - 涉及多个 XA 资源 Tx mgr - JTA

以下是我迄今为止所做的实验结果:

实验 1 - 依赖未提交的读取

  1. 读取数据库记录
  2. 作为全局 JTA 事务的一部分,在另一个表中通过 id 锁定记录
  3. 处理记录 尝试锁定同一记录的第二个事务将失败,将删除该记录。但是为了使这个工作,RDBMS 应该允许脏读。不幸的是,Oracle 不支持读取未提交的隔离级别。

实验 2 - 本地事务中的锁定记录

  1. 读取数据库记录
  2. 在另一个表中通过 id 锁定记录,作为单独的本地事务
  3. 当事务成功提交时处理记录并删除记录 尝试锁定同一记录的第二个事务将失败,将删除记录。这种方法基于提交的数据,应该可以正常工作。问题来了 - 由于锁事务和全局父事务不同,如果处理失败回滚主事务,我应该通过回滚锁事务来补偿,我不知道该怎么做 -需要帮助在这里

如果我无法回滚记录锁定事务,则必须围绕记录锁定代码编写一些脏逻辑。我不喜欢这个。

这似乎是一个非常普遍的要求。我想知道你们如何优雅地处理这个问题。Oracle 是否支持以任何方式使未提交的更新对所有事务可见。

提前非常感谢。

4

1 回答 1

1

我们有一个实用程序类,大致实现了您在实验 2 中描述的内容:

先决条件:有一个专用的锁表

在锁定阶段,创建一个新连接;对锁表执行 INSERT INTO。

在解锁阶段,无论业务逻辑的执行如何,都会对连接执行回滚。

它像 java.util.concurrent.locks.Lock 一样使用:

Lock lock = new Lock(...);
lock.lock();
try {

    // your business logic
} finally {
   lock.unlock();
}

它适用于 websphere / oracle。

请注意,如果您使用 JPA,则有对实体锁定的内置支持。

于 2011-09-12T16:40:36.530 回答