【问题标题】:Is it possible to column-level optimistic locking in JPA toplink?是否可以在 JPA toplink 中进行列级乐观锁定?
【发布时间】:2011-05-31 20:04:19
【问题描述】:

我在JPA中研究了optimistic locking,在DB中添加@Version annotation和版本列以及EntityManager如何管理它等

文档说(用我自己的话来说)乐观锁在对象级别是有效的。我可以说确实如此,因为版本定义位于实体类中。

这意味着:

  1. userA 选择 row_A(只是 db 表中的一行)

  2. userB 选择 row_A

  3. userA 更新用户名列的 row_A(此处版本更改)

  4. userB 更新用户名列的 row_A(抛出 optimisticLockException)

到目前为止一切顺利。

但是在第4步考虑,如果

例如userB update row_A of phoneNumber

我知道仍会抛出optimisticLockException,但有没有办法按列级别而不是对象级别锁定?

对我来说,拥有列级锁会很好,但我也不确定这会带来什么缺点,即使它是可能的。

【问题讨论】:

    标签: java jpa toplink optimistic-locking


    【解决方案1】:

    接受的答案并不完全正确。在 vanilla JPA 级别确实如此,但是,您可以利用提供程序特定的功能来获取列级锁。例如,Glassfish 3.0+ 中的默认提供程序 Eclipselink 支持 Optimistic 锁定扩展,在这方面提供了更大的灵活性。

    Eclipselink JPA Extensions for Optimistic locking

    还有

    Optimistic Version Locking Policies and Cascading

    有关 Eclipselink 的 Optimistic 字段锁定策略的详细信息。

    【讨论】:

      【解决方案2】:

      我可以看到这种锁定的使用,但它会违反数据库更新的原子性。想象一下,我正在编写一个银行应用程序,其中人们有余额和透支限制。说我开始:

      Customer  | Balance | Overdraft Limit
      Shirakawa |  -30000 |          -50000
      

      然后白川先生出现并通过不同的收银员一次进行了两次交易;一个,他提取15000日元,另一个,他将透支限额降低到40000日元。这些事务中的每一个都可以单独使用,并且不会违反业务逻辑中的任何约束。但结果是:

      Customer  | Balance | Overdraft Limit
      Shirakawa |  -45000 |          -40000
      

      哦哦。

      我承认这是一个人为的例子。但这就是不支持列级并发更新的普遍原因。

      不过,您可以做的是将记录的同时可更新部分分解为单独的实体,并分别更新它们。将其应用于上述示例,假设我们有一个如上所述的帐户表,还有一个透支协议表,具有一对一的关系。然后我们会:

      Customer  | Balance
      Shirakawa |  -45000
      
      Customer  | Overdraft Limit
      Shirakawa |          -40000
      

      我们可以并行更新这些。在这种情况下,这将是一个坏主意,但它可能对您有用。

      【讨论】:

      • 我也喜欢单独处理的部分。谢谢你的例子!
      【解决方案3】:

      没有。请记住,JPA 所做的只是将对象映射到底层关系数据库。因此,表中的每条记录(行)最终都会成为对象的一个​​实例。

      数据库通常锁定记录而不是列。锁定整列几乎就像在表上的排他锁。

      【讨论】:

        猜你喜欢
        • 2016-09-23
        • 2021-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-14
        • 2015-06-10
        • 2011-10-18
        • 1970-01-01
        相关资源
        最近更新 更多