考虑以下情景:
两个new order事务A、B持有相同d_id,w_id,no_id(同时执行了select next_o_id from district)
- 事务A先执行成功,然后事务B再插入则会发生索引键重复,返回failure,如果脚本不做处理,只有abort会重做,会执行事务B成功;
- 事务A先执行成功,然后发生delivery事务正好删除了这个new_order(d_id,w_id,no_id),此时事务B再执行,插入orders、order_line表会发生索引键重复无法插入,插入new_orders表正常插入,没有出现abort,则执行成功。
对前三种一致性检验规则无影响,因为1、2情况执行了2个new_order事务,ordes表插入了一次,一致性不通过。
这种情况要保证随机生成的2个d_id和w_id都一样,在小w才有可能比较大的概率。
官方脚本貌似是每个no_id都是递增生成的,所以不存在同一时刻两个new order事务持有相同键,从而不存在索引重复的情况。
如果不这么处理应该发生索引重复也得回滚,重做事务再查district就是新的值了。
考虑以下情景:
两个new order事务A、B持有相同d_id,w_id,no_id(同时执行了select next_o_id from district)
对前三种一致性检验规则无影响,因为1、2情况执行了2个new_order事务,ordes表插入了一次,一致性不通过。
这种情况要保证随机生成的2个d_id和w_id都一样,在小w才有可能比较大的概率。
官方脚本貌似是每个no_id都是递增生成的,所以不存在同一时刻两个new order事务持有相同键,从而不存在索引重复的情况。
如果不这么处理应该发生索引重复也得回滚,重做事务再查district就是新的值了。