java - 如何保存表的顺序并防止并发问题

标签 java database spring hibernate jpa

我遇到以下问题,我必须保存表中某些元素的顺序。这是通过订单号完成的。因此,第一个元素的排序为 1,第十个元素的排序为 10 等。此外,我还保存了一个品牌值,这意味着排序仅在一个品牌的所有行内。 我的配置是Spring 3.1,带有Hibernate 4.1.6和Spring Data,我还使用JPA接口(interface),底层是Mysql数据库。

我现在有一个保存方法,它通过命名查询获取最大值。然后将该值加一。现在使用对象 setter 设置值。然后保存。

    if(tag.getOrdering()==0) {
        int newOrderingNumber = tagRepository.getMaximumOrderingNumber();
        newOrderingNumber++;
        if(LOGGER.isDebugEnabled()) {
            LOGGER.debug("Next Ordering Number for Tag is " + newOrderingNumber);
        }
        tag.setOrdering(newOrderingNumber);
    }

这里我有一个问题,如果两个线程同时执行此操作会发生什么。 他们都会保存相同的值。但必须增加两次。 我的问题是如何防止这种情况发生。 首先,我尝试对 spring 事务的隔离级别进行一些操作,但是 JPA 不知道事务级别以及我发现如何扩展 jpadialect 的方法,如下所示( http://amitstechblog.wordpress.com/2011/05/31/supporting-custom-isolation-levels-with-jpa/ ) 但这不起作用,我的连接始终是只读的,readOnly=false 标志设置不正确,我没有找出问题所在。我也认为这不能解决我的问题。

然后我尝试使用 @Version 属性,但这不起作用,因为我不处理一个对象实例。两个线程正在处理两个不同的行,因此版本控制不能解决问题。

所以现在我看到四种不同的方法。

第一:我可以在代码中使用同步锁对象,让一个线程等待另一个线程释放对象上的锁

第二:我可以获得全表锁,我不知道如何使用 hibernate 来实现这一点,而且它似乎太大了,无法阻止整个表。

第三:当我没有其中顺序可以相同的品牌列时,我可以添加一个唯一约束,该约束将抛出一个异常,我可以使用它再次增加它,直到它起作用。

第四:现在我找到了一种额外的方法,它可以工作。我不保存订购号。相反,我添加了一列,其中包含按顺序下一个元素的 id。这意味着每个请求中都有一个按顺序连接的连接,但我知道这个表没有很多行,所以性能并不重要。此外,订单更改时的更新也会容易得多。

那么解决这个问题的正确方法是什么?当顺序更改时必须更新所有对象时,我还必须解决这个问题。

最佳答案

使用 mysql 触发器应该可以让您非常直接地检查其他 SO question .

关于java - 如何保存表的顺序并防止并发问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15611683/

相关文章:

java - 作为 Java 配置 Bean 的 Spring HttpRemoting 客户端

java - 使用 GPS 和 XMLVM 的 J2ME 应用程序

java - 如何使用 JPA(或至少使用 Hibernate)处理大型数据集?

java - 自动将内联 XSD 从 WSDL 提取到 XSD 文件中

spring - Prometheus UI,Spring Boot 应用程序的 Grafana 设置

java - 可以在双向关系中创建两列吗?

java - 这个 ENUM 方法线程安全吗?

.net - Order By 基于 Dictint Group 计数

php - 怎么了? "Error: INSERT INTO.... Unknown column ' 工作'在 'field list' ”

mysql - 在确保非主键列(即 wid)唯一且自动递增的同时处理并发 SQL 插入的正确实现是什么?