对并发事务的影响

如果数据库有事务日志记录,则您必须单独发出 START VIOLATIONS TABLE。也就是说,当您在事务内对目标表发出 START VIOLATIONS TABLE 时,在目标表上不可有任何其他事务正在处理。在第一个事务已发出 START VIOLATIONS TABLE 语句之后,在目标表上启动的任何事务有关违反表和诊断表的行为都会与第一个事务的方式相同。也就是说,由这些随后的事务引起的任何约束或唯一索引违反都会记录在违反表和诊断表中。

例如,如果事务 A 在表 tab1 上操作,并在表 tab1 上发出 START VIOLATIONS TABLE 语句,则数据库服务器启动名为 tab1_vio 的违反表,并将由事务 A 在表 tab1 上引起的任何约束或唯一索引违反都过滤到表 tab1_vio。如果在事务 A 已发出了 START VIOLATIONS TABLE 语句之后,在表 tab1 启动事务 B 和 C,则还会将由事务 B 和 C 引起的任何约束和唯一索引违反过滤到表 tab1_vio

结果就是,所有这三个事务都不会收到关于约束和唯一索引违反的错误消息,即使事务 B 和 C 并不期望该行为。例如,如果事务 B 在表 tab1 上发出一违反检查约束的 INSERT 或 UPDATE 语句,数据库服务器不会向事务 B 发出约束违反错误。数据库服务器反而会将不符合的行(也称为“坏行”)过滤到违反表,而不通知发生了数据完整性违反的事务 B。

当您在 SET Database Object Mode、CREATE TABLE、ALTER TABLE 或 CREATE INDEX 语句中指定 FILTERING 模式时,您可通过指定 WITH ERRORS 来防止在 GBase 8s 中发生这种情况。当多个事务在表上操作且 WITH ERRORS 选项生效时,在目标表上违反约束或唯一索引要求的任何事务都会收到数据完整性错误消息。