触发器测试
目的:验证触发器的整个操作属于同一个事务
测试对象:insert触发器
测试目标:数据插入时,尽管触发器为after insert模式,插入数据也只有在执行完触发器动作之后才对其他session可见
环境准备:
-- 原表
create table trigger_test(id int primary key AUTO_INCREMENT, v int);
-- 数据备份表
create table trigger_test_2(id int, v int);
-- 临时数据表
create table v(v int)
-- 触发器
DELIMITER //
create trigger test_trigger after insert on trigger_test for each row
begin
insert into v select sleep(10);
insert into trigger_test_2 values(new.id, new.v);
end
//
DELIMITER ;
-- 希望在向插入trigger_test数据时,需向trigger_test_2插入成功之后,新的数据才对其他session可见
测试语句:
session 1 | session 2 |
---|---|
insert into trigger_test(v) values (1); | select * from trigger_test; |
无执行sql | select * from trigger_test_2; |
结果:
- 新增数据在10s之后才对其他session可见
- 触发器执行报错,原表数据回滚
使用:
同步数据时,触发器使用 insert 语句向目的表同步数据。 同时有一个存储过程使用 insert ignore 向目的表同步存量数据。 该测试结果可保证触发器插入增量数据时不会因为 唯一约束 问题导致插入失败。
补充:
数据表使用MyISAM引擎同样在触发器未执行完成时新增数据对其他会话不可见