有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java悲观锁定与预备状态hibernate

我有一个批量处理系统,可以汇总成功计数。许多服务器进行聚合,所有服务器都同时更新表中的一行。我像这样使用hibernate执行准备好的语句

SQL_UPDATE = "UPDATE STATS.COUNTS SET SUCCESSCOUNT = SUCCESSCOUNT + ? WHERE ID = ?"
update = session.connection().prepareStatement(SQL_UPDATE);
update.setLong(1, data.getSuccessCount());
update.setLong(2, data.getBatchId());
update.execute();

几乎没有并发问题,因此决定使用悲观锁定,因为冲突的可能性非常高。在hibernate中使用这样的准备语句时,如何执行悲观锁定


共 (2) 个答案

  1. # 1 楼答案

    您没有提到设置事务的隔离级别。你有没有试过用类似 @事务性(隔离=隔离.SERIALIZABLE,传播=传播.REQUIRED)

    否则,Hibernate会话锁方法对对象有效,不适用于SQL DDL

  2. # 2 楼答案

    如果担心并发性,可以将事务隔离级别从默认更改为可序列化。这是最高级别的隔离。最高隔离度会增加死锁的可能性,从而导致性能问题

    如果是批量更新,最好不要有高级别的隔离。您可以考虑评估批处理技术,如Spring Buffing。