这就是我的要求 - 锁定数据库记录,处理它并释放它
环境 - weblogic 10.3 数据库——Oracle 11g 数据源 - 涉及多个 XA 资源 Tx mgr - JTA
以下是我迄今为止所做的实验的结果:
实验 1 - 依赖未提交的读取
- 读取数据库记录
- 通过 ID 锁定另一个表中的记录,作为全局 JTA 事务的一部分
- 处理记录 尝试锁定同一记录的第二个事务将失败,并将删除该记录。 但要实现这一点,RDBMS 应该允许脏读。 不幸的是,Oracle 不支持读未提交隔离级别。
实验2-本地事务中锁定记录
- 读取数据库记录
- 通过 id 将记录锁定在另一个表中,作为单独的本地事务
- 事务提交成功后处理记录并删除记录 尝试锁定同一记录的第二个事务将失败,并将删除该记录。这种方法基于提交的数据,应该可以正常工作。 问题是 - 由于锁定事务和全局父事务不同,如果处理失败回滚主事务,我应该通过回滚锁定事务来补偿,我不知道该怎么做 - 需要帮助这里
如果我无法回滚记录锁定事务,则必须在记录锁定代码周围编写一些脏逻辑。我不喜欢这个。
这似乎是一个非常常见的要求。我想知道你们如何优雅地处理这个问题。 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,则有对实体锁定的内置支持。
关于java - jdbc中的加锁、处理和释放锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7390726/