0

当我制作一个对象时,我需要查看 database.object 并在表中找到该对象的最大键。当我找到最大数字时,我需要将它增加 1,我的新对象将拥有那个新密钥。这些键是依赖于对象类型的,而且类型很多,所以我不能使用id。

示例:表格对象

Id, Name, Type, Key
1,  One,   T1,   6
2,  Two,   T1,   3
3,  Three, T2,   88
4,  Four,  T1,   101

我面临的问题:更多的用户可以创建新对象(并且有一些计算,所以这个操作不是很快),有时两个或多个用户最终使用相同的密钥?!

使用 jdbc 我可以使用 SELECT .. FOR UPDATE 并锁定表。

有没有推荐的解决方案如何使用休眠实现这一目标?

谢谢

4

4 回答 4

1

在数据库中保存新值时需要进行ACID 操作。访问所需字段的最大数量和新 id 创建和提交操作的数量应该是一个单元,并且事务提供此功能。

我不确定你的配置。您可以使用休眠事务

您可以访问也有一些条件的最大行值。另请参阅文档

public Long maxRowValue()
    {

        Criteria crit = sess().createCriteria(YourEntity.class);    
        crit.setProjection(Projections.max("Key"));
        crit.add( Restrictions.eq("Type", 1));
        List<Long> teams = crit.list(); 
        return teams.get(0);

    }

PS我不知道你的配置细节。代码应相应更改。

于 2013-05-10T18:37:33.777 回答
0

首先,您使用的底层 DBMS 是什么?

一些数据库(实际上大多数)具有处理自动 id 生成的特殊功能,同时保持事务隔离。例如,Oracle 数据库具有“插入前开启”触发器,可用于满足您的需求。

顺便说一句,“键”值必须是顺序的,还是唯一的就足够了?

于 2013-05-10T12:59:08.810 回答
0

在某些情况下,我也有同样的需求。我所做的是创建一个保持最大值的新表。这张表只有一行,所以很容易阅读,不需要锁定整张表。每当您想获取新密钥或更新密钥时,只有此表。然后你的交易

  • 首先锁定这张表
  • 然后它读取它的内容,
  • 然后使用它来设置新实体中的键值,
  • 然后存储新实体
  • 用新值更新 max_key 表
  • 最后提交并释放锁。
于 2013-05-10T12:56:53.123 回答
0

我曾经有过这样的问题。这些表具有多列主键,最后一个元素对于前缀列是唯一的。

我用SEQUENCESKEYCURR_VALUE. 钥匙看起来像这样:

表名_col1value_col2value

例如:

cities_1_2
cities_1_3
cities_3_4

这样,您可以编写存储过程来锁定给定键、获取值、增加表中的值并返回值。SELECT MAX它比每次发出都要快得多。

于 2013-05-10T13:25:23.857 回答