在jdbc中锁定,处理和释放锁定

时间:2011-09-12 16:02:34

标签: java jdbc transactions oracle11g distributed-transactions

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

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

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

实验1 - 依靠未提交读取

  1. 阅读db记录
  2. 在另一个表中按id锁定记录,作为全局JTA事务的一部分
  3. 处理记录 尝试锁定同一记录的第二个事务将失败,将丢弃记录。 但为了实现这一点,RDBMS应该允许脏读。 遗憾的是,Oracle不支持读取未提交的隔离级别。
  4. 实验2 - 锁定本地交易中的记录

    1. 阅读db记录
    2. 将记录锁定在另一个表中的id,作为单独的本地事务
    3. 处理记录并在事务成功提交时删除记录 尝试锁定同一记录的第二个事务将失败,将丢弃记录。这种方法基于提交的数据,应该可以正常工作。 这是问题 - 由于锁定事务和全局父级不同,如果处理失败回滚主事务,我应该通过回滚锁定事务来补偿,我不知道该怎么做 - 需要帮助此处
    4. 如果我无法回滚记录锁定事务,则必须在记录锁定代码周围写一些脏逻辑。我不喜欢这个。

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

      提前多多感谢。

1 个答案:

答案 0 :(得分: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,则内置支持实体锁定。