怎么解决MySql重复插入问题?[面试7.0]
单库单表: 唯一索引,DUAL临时表
唯一索引: 如主键索引
DUAL临时表:
如:
单条记录
INSERT INTO card(cardno, cardnum) SELECT ‘111’, ‘100’ FROM DUAL WHERE NOT EXISTS(SELECT cardno FROM card WHERE cardno = ‘111’)
多条记录
INSERT INTO user (id, no,add_time,remark)
select * from (
SELECT 1 id, 1 no, NOW() add_time,‘1,2,3,1,2’ remark FROM DUAL
UNION ALL
SELECT 1 no, 2 no, NOW() add_time,‘1,2,3,1,2’ remark FROM DUAL
UNION ALL
SELECT 1 no, 3 no, NOW() add_time,‘1,2,3,1,2’ remark FROM DUAL
) a where not exists (select no from user b where a.no = b.no)
Mybatis写法
INSERT INTO user (id, no,add_time,result)
select * from (
<foreach collection=“list” item=“obj” separator=" UNION ALL " >
SELECT #{obj.id} id, #{obj.no} no, #{obj.addTime} add_time,#{obj.result} result FROM DUAL
</foreach>
) a where not exists (select no from user b where a.no = b.no)
怎么解决MySql重复更新问题?[面试7.0]
使用乐观锁version版本法:
select goods_num,version from goods where goods_name = “小本子”;
update goods set goods_num = goods_num -1,version =查询的version值自增 where goods_name =“小本子” and version=查询出来的version
适用场景:
超卖: 两个用户同时购买一件商品,库存只有1件了,第一个用户购买完库存减1操作,由于这个操作没有完全执行完成,第二个用户已经读取到还有1个库存,也会执行购买,这样就会出现商品超卖
原理解释:
update语句执行的时候,若更新的时候update语句不走索引就会将表锁住(走索引就会锁行)保证了一个时刻只有一个线程能进入更新,等这次更新释放锁以后才会执行下一次的update操作,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据