使用预处理语句hibernate进行悲观锁定

时间:2014-01-02 11:53:39

标签: java mysql hibernate locking pessimistic-locking

我有一个批处理系统,可以聚合成功计数。许多服务器进行聚合,同时更新表中的单个行。我像这样使用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 个答案:

答案 0 :(得分:1)

您没有提及设置事务的隔离级别。您是否尝试使用类似的东西进行设置     @Transactional(隔离= Isolation.SERIALIZABLE,propagation = Propagation.REQUIRED)

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

答案 1 :(得分:1)

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

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