那就是我的要求-锁定数据库记录,对其进行处理并释放它
环境-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,则内置支持实体锁定。