问题描述:
在做数据迁移的需求时,需要把原表的数据插入到迁移表中,插入完成后要把原表的数据删除。
因此就有两步操作:
- 插入数据到迁移表
- 删除原表的数据
这两步操作要保证原子性[^1],所以就将插入、删除操作放在同一个方法中,并在方法上添加了事物即@Transactional注解。
因为我这里的数据迁移是通过循环逐条迁移的,为了避免某条数据的迁移报错而影响后续数据的迁移。所以在进行具体插入、删除的方法中使用了try/catch。
在同一个方法中同时使用了@Transactional与try/catch这就导致了冲突。当这两步操作中出现异常,就会被try/catch接收,就导致了@Transactional接收不到异常,也就不能对成功的操作进行回滚。
解决方法:
将插入、删除操作提出来,重新创建一个方法,并在此方法上添加@Transactional注解。再到主业务中使用for循环来调用此方法,调用方法时,用try/catch包含调用。