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
其它见搜索:批量更新 加锁