[英]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"
);
我有一个两部分的问题:
来自关于读取稳定性 (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.