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

2020年8月3日 17点热度 0条评论

那就是我的要求-锁定数据库记录,对其进行处理并释放它

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

这是我到目前为止所做的实验的结果:

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

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

实验2-锁定本地交易记录

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

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

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

非常感谢。

解决方案如下:

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

先决条件:拥有专用的锁表

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

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

它的用法类似于java.util.concurrent.locks.Lock:

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

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

它适用于Websphere / oracle。

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