java - jdbc中的加锁、处理和释放锁

标签 java jdbc transactions oracle11g distributed-transactions

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

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

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

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

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

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

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

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

这似乎是一个非常常见的要求。我想知道你们如何优雅地处理这个问题。 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/

相关文章:

java - java可能会出现 "mix up"同一类的不同实例的原因是什么?

java - Android AlarmManager 闹钟不工作

java - preparedStatement.getString() 方法不适用于嵌套 sql 查询

java - Hibernate 5.0.2 与 Sqlite — 由于错误而无法使其工作

java - 使用JOOQ,我还需要什么来防止sql注入(inject)

java - Eclipse 插件 - 文件未找到异常

java - 使用 Criteria + 投影时在 getter 中包含代码

java - @Transactional 回滚以及 @ExceptionHandler

java - Spring 中 @Transactional 相对于 ProxyFactoryBean 的性能

hibernate - Spring:尚未配置事务管理器