触发器测试
目的:验证触发器的整个操作属于同一个事务
测试对象: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 引擎同样在触发器未执行完成时新增数据对其他会话不可见
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于