Java jdbc中的锁、处理和释放锁

Java jdbc中的锁、处理和释放锁,java,jdbc,transactions,oracle11g,distributed-transactions,Java,Jdbc,Transactions,Oracle11g,Distributed Transactions,这就是我的要求——锁定数据库记录,处理并释放它 环境-weblogic 10.3 数据库-Oracle 11g 数据源-涉及多个XA资源 德克萨斯州经理-JTA 以下是我迄今为止所做实验的结果: 实验1-依赖未提交的阅读 读取数据库记录 作为全局JTA事务的一部分,在另一个表中按id锁定记录 处理记录 尝试锁定同一记录的第二个事务将失败,并删除该记录。 但是为了实现这一点,RDBMS应该允许脏读。 不幸的是,Oracle不支持读取未提交隔离级别 实验2-锁定本地事务中的记录 读取数据库记录 在另

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

环境-weblogic 10.3 数据库-Oracle 11g 数据源-涉及多个XA资源 德克萨斯州经理-JTA

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

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

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

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

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


    提前非常感谢。

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

    先决条件:有专门的锁桌

    在锁定阶段,创建一个新连接;在锁表上执行插入

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

    它的使用方式类似于java.util.concurrent.locks.Lock:

    Lock lock = new Lock(...);
    lock.lock();
    try {
    
        // your business logic
    } finally {
       lock.unlock();
    }
    
    它在websphere/oracle上工作


    请注意,如果使用JPA,则内置了对实体锁定的支持

    这是一个完美的工作示例。在这里,您的代码控制整个工作流。但在我们的例子中,它是spring集成框架。消费者的多个实例驻留在不同的weblogic节点中(每个节点1个)。我可以在处理消息之前将更改提交到临时表。我也可以释放锁后处理。但是如果消息处理中出现异常,那么锁就会被卡住(在异常情况下我没有回调)。因此,我应该在消息处理之前根据锁的使用时间编写一些肮脏的逻辑。这是我的问题。是否可以在用户端管理锁?如果使用者是MDB,拦截器可以管理锁;它将保持您的业务逻辑干净。我的目标是防止消息传递给多个消费者。如果消费者将中止作为异常情况处理,这是我唯一的出路,但这并不完美。在实验中,应该发生以下情况:获取db记录,在另一个表中按id锁定记录(我假设您将id插入另一个表,并且id是主键)。这将锁定此记录。试图将同一密钥插入表的任何其他事务都将阻塞/失败。