是否可以锁定表以防止插入/更新/删除?
我需要锁定一个表,删除一些记录,然后重置"发电机。
>> lock table logs to prevent inserts/updates/deletes;
delete from logs where id <= :lastIdProcessed;
if ((select count(1) from logs) = 0) {
alter sequence logSequence restart with 0;
}
>> commit and release table
另一个问题是,如果有insert into logs (gen_id(logSequence,1))
等待锁定释放,我将进入throwble,插入将在logSequence
使用其值{{1}之前递增的情况下运行}}?
答案 0 :(得分:2)
根据您的需要,您可以使用
启动表预留的快照表稳定性事务SET TRANSACTION
READ WRITE
ISOLATION LEVEL SNAPSHOT TABLE STABILITY
WAIT
RESERVING <tablename>, <tablename> FOR PROTECTED WRITE
SNAPSHOT TABLE STABILITY隔离级别
SNAPSHOT TABLE STABILITY
隔离级别最高 限制。与SNAPSHOT
中的交易一样SNAPSHOT TABLE STABILITY
隔离仅查看已提交的更改 在当前交易开始之前。之后SNAPSHOT TABLE STABILITY
已启动,其他任何事务都无法对其进行任何更改 数据库中具有待更改的任何表。其他交易 能够读取其他数据,但任何尝试插入,更新或 通过并行进程删除将导致冲突异常。
RESERVING
子句可用于允许其他事务 更改某些表格中的数据。如果任何其他事务的未提交的数据更改未决 与事务之前的任何数据库表
SNAPSHOT TABLE STABILITY
隔离级别已启动,尝试启动SNAPSHOT TABLE STABILITY
事务将导致异常。[..]
RESERVING
RESERVING
语句中的SET TRANSACTION
子句保留 表列表中指定的表。保留表会阻止其他表 通过包含来改变它们甚至是它们的交易 某些参数,从这里读取数据 交易正在运行。
RESERVING
子句也可用于指定表的列表 即使交易是,也可以通过其他交易进行更改 以SNAPSHOT TABLE STABILITY
隔离级别开始。一个
RESERVING
子句用于指定尽可能多的保留表 必需的。
有关详细信息,请参阅Transaction Statements;您可能还想查阅旧的Interbase 6.0文档(特别是嵌入式SQL指南和开发人员指南,最后请参阅https://www.firebirdsql.org/en/reference-manuals/)以获取相关信息。
我没有使用此功能的经验,因此我无法就其潜在的陷阱向您提供建议。