Transactions “火鸟锁”;表「;防止插入

Transactions “火鸟锁”;表「;防止插入,transactions,locking,firebird,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; } >>

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

我需要锁定一个表,删除一些记录并“重置”生成器

>> 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
>锁定表日志以防止插入/更新/删除;
从id>提交和发布表所在的日志中删除

另一个问题是,如果有一个
插入到日志中(gen_id(logSequence,1))
正在等待锁的释放,我将进入throwble,insert将在
日志序列
使用其值递增的情况下运行,然后再
重新启动

根据您的需要,您可以使用

SET TRANSACTION 
    READ WRITE 
    ISOLATION LEVEL SNAPSHOT TABLE STABILITY 
    WAIT
    RESERVING <tablename>, <tablename> FOR PROTECTED WRITE
设置事务
读写
隔离级别快照表稳定性
等待
保留,用于受保护的写入
快照表稳定性隔离级别
快照表稳定性
隔离级别最高 限制性的。与快照中一样,快照中的事务
快照表稳定性
隔离只查看已提交的更改 在当前事务启动之前。过了一会儿
快照表稳定性
已启动,其他事务无法对其进行任何更改 数据库中具有挂起更改的任何表。其他交易 能够读取其他数据,但任何插入、更新或 由并行进程删除将导致冲突异常

RESERVING
子句可用于允许其他交易继续进行 更改某些表中的数据

如果任何其他事务中有未提交的数据更改挂起 使用
快照表稳定性
隔离级别已启动,正在尝试启动
快照表稳定性
事务将导致异常

[……]

保留
SET TRANSACTION
语句中的
RESERVING
子句保留 表列表中指定的表。预订一张桌子可以防止其他人 交易不允许对其进行更改,甚至包括 从某些参数中读取数据,而 事务正在运行

RESERVING
子句也可用于指定 可以由其他事务更改,即使该事务是 从
快照表稳定性
隔离级别开始

一个
RESERVING
子句用于指定尽可能多的保留表 必需的

有关更多信息,请参阅;您可能还想查阅旧的Interbase 6.0文档(特别是嵌入式SQL指南和开发人员指南,请参见末尾)以获取信息


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

根据您的需要,您可以使用

SET TRANSACTION 
    READ WRITE 
    ISOLATION LEVEL SNAPSHOT TABLE STABILITY 
    WAIT
    RESERVING <tablename>, <tablename> FOR PROTECTED WRITE
设置事务
读写
隔离级别快照表稳定性
等待
保留,用于受保护的写入
快照表稳定性隔离级别
快照表稳定性
隔离级别最高 限制性的。与快照中一样,快照中的事务
快照表稳定性
隔离只查看已提交的更改 在当前事务启动之前。过了一会儿
快照表稳定性
已启动,其他事务无法对其进行任何更改 数据库中具有挂起更改的任何表。其他交易 能够读取其他数据,但任何插入、更新或 由并行进程删除将导致冲突异常

RESERVING
子句可用于允许其他交易继续进行 更改某些表中的数据

如果任何其他事务中有未提交的数据更改挂起 使用
快照表稳定性
隔离级别已启动,正在尝试启动
快照表稳定性
事务将导致异常

[……]

保留
SET TRANSACTION
语句中的
RESERVING
子句保留 表列表中指定的表。预订一张桌子可以防止其他人 交易不允许对其进行更改,甚至包括 从某些参数中读取数据,而 事务正在运行

RESERVING
子句也可用于指定 可以由其他事务更改,即使该事务是 从
快照表稳定性
隔离级别开始

一个
RESERVING
子句用于指定尽可能多的保留表 必需的

有关更多信息,请参阅;您可能还想查阅旧的Interbase 6.0文档(特别是嵌入式SQL指南和开发人员指南,请参见末尾)以获取信息


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

将所有数据库切换到除SYSDBA模式以外的无连接模式,清除表,重置生成器,将数据库切换回工作模式您可以在插入或更新之前放置触发器,该触发器会无条件地导致错误,如除零,这将排除任何添加的数据。然而,这是一种“丑陋的黑客行为”,你可以使用你所有的用户/角色/过程,并撤销他们修改表的安全权限,但总而言之,这似乎是一个相当不合理的想法,为什么会有人想要它?将所有数据库切换到除SYSDBA模式以外的无连接模式,清除表,重置生成器,将数据库切换回工作模式您可以在插入或更新之前放置一个触发器,该触发器会无条件地导致错误,如被零除,这将排除任何添加的数据。然而,这是一种“丑陋的黑客行为”,你可以利用你所有的用户/角色/程序,并撤销他们修改表格的安全权限,但总而言之,这似乎是一个相当不合理的想法,为什么有人会想要它?