Mysql insert 自增 id 表,如何进行回滚语句生成 30
请问如果对一个有自增主键的表t进行一个批量的Mysql操作,例如insertintot(col2,col3)values(1,1),(2,2),(3,3);但是在并发的情...
请问 如果对一个有自增主键的表 t 进行一个批量的 Mysql 操作,
例如 insert into t (col2,col3) values (1,1),(2,2),(3,3);
但是在并发的情况下在插入的时间有可能有其他人操作这个表写入,导致自增改变,无法根据查询自增ID来进行判断。
如何才能生成对应的回滚语句,仅删除掉这部分新增的值,等同根据ID删除。
当前遇到问题
1、若根据条件去生成回滚语句,可能把历史的 (1,1) (2,2) 的数据删除掉了 例如:delete from t where col2 = 1;
2、若根据主键去回滚,在操作时候主键ID可能会已经被其他事务插入数据导致自增ID值已变大,无法精确定位到新增数据对应的ID 展开
例如 insert into t (col2,col3) values (1,1),(2,2),(3,3);
但是在并发的情况下在插入的时间有可能有其他人操作这个表写入,导致自增改变,无法根据查询自增ID来进行判断。
如何才能生成对应的回滚语句,仅删除掉这部分新增的值,等同根据ID删除。
当前遇到问题
1、若根据条件去生成回滚语句,可能把历史的 (1,1) (2,2) 的数据删除掉了 例如:delete from t where col2 = 1;
2、若根据主键去回滚,在操作时候主键ID可能会已经被其他事务插入数据导致自增ID值已变大,无法精确定位到新增数据对应的ID 展开
1个回答
展开全部
两个办法。
第一是你批量插入的数据要么全部成功,要么全部失败,不需要顾及部分成功的时候回滚存在所谓的误删。意思就是说(1,1),(2,2),(3,3) 三个插入,要不就都进去了,要不都不要进去;只要考虑直接rollback就行了;
第二个办法是你自己控制写入的主键值,维护一个主键的序列,每次插入之前先去序列里面申请一个值,即使并发的时候也要这么做,从机器角度来讲,真正在毫秒级别上的并发也能被识别出来;确保了每组写入的主键不同,失败的时候就知道到底是哪个主键对应的插入失败了。就是类似于使用oracle的sequence值来做主键。
第一是你批量插入的数据要么全部成功,要么全部失败,不需要顾及部分成功的时候回滚存在所谓的误删。意思就是说(1,1),(2,2),(3,3) 三个插入,要不就都进去了,要不都不要进去;只要考虑直接rollback就行了;
第二个办法是你自己控制写入的主键值,维护一个主键的序列,每次插入之前先去序列里面申请一个值,即使并发的时候也要这么做,从机器角度来讲,真正在毫秒级别上的并发也能被识别出来;确保了每组写入的主键不同,失败的时候就知道到底是哪个主键对应的插入失败了。就是类似于使用oracle的sequence值来做主键。
追问
mysql 是自带 auto_increment 功能,也就是自增的,当前就是纠结在如何有其他并发写入的情况下获取到这部分插入的ID值~~
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询