mysql并发处理

在mysql中,并发问题是经常遇见的,这里总结一些,还有待提升。
mysql并发场景举例:

  1. 商城下单,一样的订单数据同时发送了两次,导致订单数据重复;
  2. 餐饮管理系统,刷卡扣款,发起了两次请求,导致有两个同样的订单,扣款发生了两次,卡内押金被扣; 方案一:
    简单的解决办法如下:
    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。