火鸟锁"表"防止插入

时间:2017-07-04 14:43:02

标签: transactions locking firebird

是否可以锁定表以防止插入/更新/删除?

我需要锁定一个表,删除一些记录,然后重置"发电机。

>> 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}之前递增的情况下运行}}?

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/)以获取相关信息。

我没有使用此功能的经验,因此我无法就其潜在的陷阱向您提供建议。