java - 使用 hibernate 锁定表

标签 java mysql hibernate

我有一个客户端-服务器应用程序,在我的服务器中我使用 hibernate 来处理数据库。现在,我的应用程序需要所有数据库表中的一个简单表,其中只有一行的一个 Biginteger 字段(这是该行中的键)。该表实际上只包含一个全局编号(从 1 开始),每次用户执行某些操作时我都会使用它,当他执行某些操作时,我需要获取此值,并增加数据库中的值。 (表格应该只包含一行,始终只有一个值)

我正在使用以下代码来实现:

 Biginteger func() {
        Session s = null;
        Biginteger idToReturn=null;
        try{
           s=factory.openSession();
           s.beginTransaction();
           Query queryResult =  s.createQuery("from GlobalId");
           List<GlobalID> theId=queryResult.list();
           idToReturn=theId.get(0).get_id();                     //getting the value from db to return
           GlobalID toSave=new GlobalId();
           toSave.set_id(idToReturn.add(BigInteger.valueOf(1))); //incrementing the id from db inorder to save it
           s.delete(theId.get(0));                               //deleting old id
           s.save(toSave);                                       //saving new id
           s.getTransaction().commit();
        }
        catch(Exception e){
            throw e;
        }
        finally{
            if (s!=null)
               s.close();
            return idToReturn;
        }
 }

这段代码工作正常。我担心的是我是否需要使用多个服务器来访问中央数据库。在那种情况下,如果两个单独的服务器将运行此功能,我需要消除它们两个将获得相同值的情况。我需要确保整个读写都是“原子的”,我需要锁定这个表,这样只有一个 session 才能读取该值,我还需要确保以防 session 意外结束,锁将被移除。

我正在使用包含 MySQL 5.6 数据库的 xampp 包。

我在网上找到的关于这个问题的信息让我感到困惑——我找到的信息是“高级”的,我找不到任何例子。

最佳答案

需要使用悲观锁,可以通过以下方式实现

setLockMode(String alias, LockMode lockMode) 

查询并使用LockMode.UPGRADE

参见 Query.setLockMode

但是,如果您对此表进行大量访问,这肯定会破坏可伸缩性和性能。您最好使用序列,或者另一种策略是创建一个服务来分配号码(例如 SSB),该服务一次获取 100 个号码,更新数据库,然后将它们分发出去。这为您节省了 198 次数据库访问。

更新:

您还必须稍微修改表格设计。最好有一个具有已知 ID 的单行,并将要递增的数字存储在另一列中。那么您应该更新该行而不是删除旧行并添加新行。否则,行锁定策略将不起作用。

更新 2:

OP 发现以下方法有效:

session.get(class.Class, id, lockOption)

关于java - 使用 hibernate 锁定表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30323459/

相关文章:

php - 注意:尝试获取C:\xampp\htdocs\中非对象的属性

java - jpa/hibernate 如何通过带注释的外键映射元素集合

java - 使用 Cloud Foundry 在一个 JVM 上使用多个 JKS keystore

mysql - 如何添加我计算平均评分并从我的专栏中添加此内容

java - 为正则表达式生成所有有效值

MySQL 错误 2006 : mysql server has gone away

java - 保存 BLOB 时为 "could not reset reader"

java - Hibernate HQL 别名问题

Java/JButton : How do I get rid of ellipses on JButton?

java - 帮助在 Oracle 企业管理器中创建新的 JAXB 实例