【常考】几个问题

本文探讨了连锁店就餐系统中确保消费记录唯一性的三种方法,包括使用消息队列、统一存储介质及分布式锁。同时深入解析MySQL事务与锁机制,包括多表操作、批量更新时的注意事项及潜在问题,如死锁与数据不一致。

1、A和B两个就餐系统(连锁店),对于某人某餐,只能二选一去消费,在A消费的记录存在A中,在B消费的记录存在B中.如何保证消费唯一不重复?
法1:借助kafka消息队列,A在出现一条记录需插入前,查询自己无此数据,并发消息给B,有且仅当B返回无此数据(A发询问-B取询问-B发回复-A取回复,类似TCP的三次握手)的消息后,才插入A的数据库。
法2:统一存储介质,A存一份,Bcopy一份,
法3:加分布式锁?

2、mysql事务和锁
(1)多表操作加事务: yii2里的beginTransaction是事务,事务自己的机制里会加锁,事务在多表操作必须同时操作(如insert A表,update B表)时用。虽会影响性能,但是数据一致性更重要,必须加事务。
(2)批量更新和批量更新不需要加事务: mysql会有锁机制,加事务,事务本身带排他锁,本次批量更新和批量更新的过程,其它操作都被阻止,极大影响性能,不要加事务。
问题:批量更新不加事务,发现插100条只显示99条
解答:可能1:真的插入100条了,mysql采用innodb存储,查询不准,可以查看mysql的binlog日志看实际插入了多少条
可能2:唯一索引问题,同一个索引的数据重复插入,重复的插不进去
可能3:sql问题

$db->beginTransaction的用法注意:见备忘录图片
1、beginTransaction要在try之前
2、$transaction->commit();要在try里面
3、$transaction->rollBack();要在catch里面
4、再有后续操作
http://blog.xrluo.com/archives/66

insert是行级锁,update是表级锁,update操作会影响数据库索引。

救命:一个看似简单的批量更新的死锁问题
https://bbs.youkuaiyun.com/topics/391904427?page=1
里面解答:
http://narcissusoyf.iteye.com/blog/1637309

其它见搜索:批量更新 加锁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值