【问题标题】:pessimistic locking with prepared statment hibernate带有准备好的语句休眠的悲观锁定
【发布时间】:2014-01-02 11:53:38
【问题描述】:

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

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

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

【问题讨论】:

  • 您是通过本机 SQL 而不是通过 Hibernate 执行此操作的,因此它无法帮助您。如果您在事务中执行查询,请先执行SELECT...FOR UPDATE,它将根据需要锁定。
  • @BoristheSpider 以上是在事务本身中执行的。通过 select...for update 你的意思是先检索对象然后进行更新?如果我执行 select...for update 不是两个查询命中 db(1 用于选择和 1 用于更新)而不是 1 在这种情况下?

标签: java mysql hibernate locking pessimistic-locking


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-12
      • 1970-01-01
      • 2013-12-24
      • 1970-01-01
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多