0

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

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();

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

4

2 回答 2

1

您没有提到设置事务的隔离级别。您是否尝试过使用 @Transactional(isolation=Isolation.SERIALIZABLE,propagation=Propagation.REQUIRED) 之类的方法设置它

否则,Hibernate 会话锁定方法适用于对象并且不适用于 SQL DDL。

于 2014-01-02T14:27:28.630 回答
1

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

同样,如果是批量更新,最好不要进行高级别隔离。您可以考虑评估像 Spring Batch 这样的批处理技术。

于 2014-01-03T07:04:05.880 回答