这个问题可能反映了我的一些误解,但有一些事情让我困惑了好几天。
根据 Oracle 文档 (19c),如果我打算修改包含 BLOB 的表,它明确建议锁定该行。但是,我不明白如果第一个写入操作将启动事务,为什么我需要这样做。
例如,如果我更新某个表的某行的某个正常列,如果我没有错的话,该特定行将被自动锁定以防止其他事务的更新。但是,为什么这不适用于 LOB?
我在这里看到的唯一解决方案是通过定位器写入 LOB 不会启动事务,这是没有意义的,因为同时文档说打开 BLOB 会给我读取一致性,直到定位器关闭。总之,我不明白如果我在不锁定表的情况下通过定位器读取和/或写入 BLOB 会发生什么不好的事情。这些信息对我来说有点矛盾。
文档正在讨论 OCI 或
DBMS_LOB
的使用,这是直接操作 LOB 的低级 API(不使用 SQL):
持久 LOB:您必须锁定从中选择 LOB 的行 如果您使用的是 PL/SQL DBMS_LOB,则在更新 LOB 值之前 包或 OCI。而 SQL INSERT 和 UPDATE 语句隐式 锁定行,锁定行可以使用 SQL 显式完成 SQL 和 PL/SQL 程序中的 SELECT FOR UPDATE 语句,或使用 OCI 程序中的 OCI 引脚或锁定功能。
调用
DBMS_LOB
使用打开的句柄/指针直接写入指定的字节位置。这根本不会调用 SQL 引擎,因此不会取消行锁。但是,如果您使用 SQL 来处理 INSERT
、UPDATE
等 LOB 值,那么您已经获得行锁定,无需担心。