mysql并发处理
在mysql中,并发问题是经常遇见的,这里总结一些,还有待提升。
mysql并发场景举例:
- 商城下单,一样的订单数据同时发送了两次,导致订单数据重复;
- 餐饮管理系统,刷卡扣款,发起了两次请求,导致有两个同样的订单,扣款发生了两次,卡内押金被扣;
方案一:
简单的解决办法如下:1
2
3
4对于同样的订单写入两次的情况,需要考虑给每个用户的下单url请求加标识。
对于扣款操作,可以用如下SQL:
update from t1 set remain_money=remain_money-$cast where card_id=$id and remain_money-$cast>20;
# 20是卡内必须有的押金
参考资料: MySQL 加锁处理分析
方案二:
使用mysql事务和锁
共享锁【S锁】
又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
排他锁【X锁】
又称写锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A。