【问题标题】:LOCK TABLE and try-catch blockLOCK TABLE 和 try-catch 块
【发布时间】:2014-06-25 11:06:01
【问题描述】:

在带有@Transactional 注释的方法中,LOCK TABLE 语句应该在try 块内还是之前执行?

选项 1:

jdbcTemplate.execute(SQL_LOCK);

try {
    //Some work
} finally {
    jdbcTemplate.execute(SQL_UNLOCK);
}

选项 2:

try {
    jdbcTemplate.execute(SQL_LOCK);

    //Some work
} finally {
    jdbcTemplate.execute(SQL_UNLOCK);
}

谢谢, 迈克尔

【问题讨论】:

  • 建议使用 try catch 块内的锁,因为它可以确保是否在 LOCKing 表上抛出任何异常

标签: java mysql locking spring-jdbc


【解决方案1】:

选项 2 似乎更可取,因为它保证了 SQL_UNLOCK 语句的执行,即使在执行 SQL_LOCK 期间抛出异常也是如此。

【讨论】:

  • 那么,如果第一次调用execute时出错,有可能是表被锁定了?
  • 可能是。可能不是。但是你不能确定,所以你必须解锁或至少尝试解锁)桌子。否则它将永远保持锁定状态。
【解决方案2】:

选择选项2,无论try-catch块是否引发异常,都会执行finally sql unlock。

如果选项1,如果在SQL LOCK中的try-catch块之前引发异常,程序不保证进入finally块将其解锁。

【讨论】:

    猜你喜欢
    • 2016-05-21
    • 1970-01-01
    • 2012-12-22
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    相关资源
    最近更新 更多