繁体   English   中英

如何使用 select 获取 DB2 中的锁定以进行更新而不传输数据?

[英]How to obtain a lock in DB2 with select for update without transferring data?

通过大量的实验我发现

jdbcTemplate是一个JdbcTemplate ,只是用来简化查询的执行。它与问题没有真正的关系)

jdbcTemplate.query(
    "select 0 from example where id = 23 for update with rs use and keep update locks", 
    rs -> {
        rs.next();
        return null;
});

获得对选定行的锁定,而这一行没有:

jdbcTemplate.query(
    "select 0 from example where id = 23 for update with rs use and keep update locks", 
    rs -> {
        return null;
});

出于同样的原因,我假设以下内容没有获得锁:

jdbcTemplate.execute(
    "select id from example where id = 23 for update with rs use and keep update locks"
);

我有一个两部分的问题:

  1. 到底他妈发生了什么?
  2. 如何执行 select 以在数据库中进行更新,从而导致锁定,但不返回每个选定行的数据? 也许某种脚本?

有一个 Github 存储库测试这些(以及更多变体)

来自关于读取稳定性 (RS)隔离级别的文档的引用:

读取稳定性隔离级别仅锁定应用程序在工作单元期间检索的那些行。

-- Rows are locked / accessed during "fetch"
select * from example where id = 23 with rs use and keep update locks;

-- Rows must be accessed either during "execute" / "open" or "fetch" to get the corresponding result
select count(1) from example where id = 23 with rs use and keep update locks;

实现RS的主要要求是:如果某行参与了该语句的第一次调用的结果,那么它必须以相同的值参与同一语句的每个后续调用的结果。

当您只是 select 行时,它们仅在fetch期间被检索(访问)。 在您获取它们之前,它们不会被访问。 无需预先锁定这些行即可实现上述逻辑目标。 如果您可能“懒惰”地获取/锁定所需的行,为什么要降低系统并发性?

但是,当您对所需的行进行一些聚合时,必须在execute / open期间或在 1-st fetch期间访问它们(并且是唯一的fetch ,因为它是聚合)以锁定相应的行。 我相信,这种行为没有记录在案 - 它只是当前观察到的行为。

为了安全起见,我建议您对聚合语句进行 1 次fetch 没有人可以保证(除非您就此向 IBM 支持人员咨询并获得相应的说明),这种行为将来可能不会改变。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM