我有一个批处理系统,可以聚合成功计数。许多服务器进行聚合,同时更新表中的单个行。我像这样使用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中使用这样的预准备语句时,如何执行悲观锁定。
答案 0 :(得分:1)
您没有提及设置事务的隔离级别。您是否尝试使用类似的东西进行设置 @Transactional(隔离= Isolation.SERIALIZABLE,propagation = Propagation.REQUIRED)
否则,Hibernate会话锁定方法适用于对象,不适用于SQL DDL。
答案 1 :(得分:1)
如果您担心并发,可以将事务隔离级别从默认值更改为SERIALIZABLE。这是最高级别的隔离。最高隔离度可能会增加死锁的可能性,从而增加性能问题。
再次,如果它是批量更新,最好不要有高级别的隔离。您可以考虑评估批量技术,如Spring Batch。