在电子商务里,经常会出现库存数量少,购买的人又特别多,大并发情况下如何确保商品数量不会被多次购买.

  其实很简单,利用事务+for update就可以解决.

  我们都知道for update实际上是共享锁,是可以被读取的.但是如何在执行时,不被读取呢.

  简单来说:假设现在库存为1,现在有A和B同时购买

  先开启一个事务

  begin;

  select stock from good where id=1 for update;//查询good表某个商品中stock的数量

  查出来后,在程序里在判断这个stock是否为0(你用什么语言,不关我事)

  最后在执行

  update good set stock=stock-1 where id=1

  最后在

  commit

  但是这个时候B也是select stock from good where id=1 for update;注意:for update不能省略..这个时候会出现被锁住,无法被读取.

  所以这就能够保证了商品剩余数量为1的一致性.

mysql中使用select for update的必须针对InnoDb,并且是在一个事务中,才能起作用。

select的条件不一样,采用的是行级锁还是表级锁也不一样。
http://www.neo.com.tw/archives/900的说明

由於 InnoDB 預設是 Row-Level Lock,所以只有「明確」的指定主鍵,MySQL 才會執行 Row lock (只鎖住被選取的資料例) ,否則 MySQL 將會執行 Table Lock (將整個資料表單給鎖住)。

舉個例子:

假設有個表單 products ,裡面有 id 跟 name 二個欄位,id 是主鍵。

例1: (明確指定主鍵,並且有此筆資料,row lock)

SELECT * FROM products WHERE id='3' FOR UPDATE;

例2: (明確指定主鍵,若查無此筆資料,無 lock)

SELECT * FROM products WHERE id='-1' FOR UPDATE;

例2: (無主鍵,table lock)

SELECT * FROM products WHERE name='Mouse' FOR UPDATE;

例3: (主鍵不明確,table lock)

SELECT * FROM products WHERE id<>'3' FOR UPDATE;

例4: (主鍵不明確,table lock)

SELECT * FROM products WHERE id LIKE '3' FOR UPDATE;

註1:
FOR UPDATE 僅適用於 InnoDB,且必須在交易區塊(BEGIN/COMMIT)中才能生效。

註2:
要測試鎖定的狀況,可以利用 MySQL 的 Command Mode ,開二個視窗來做測試。

最新文章

  1. [LeetCode] Sqrt(x) 求平方根
  2. 解读sencha touch移动框架的核心架构(一)
  3. hander消息机制原理
  4. 挤点时间写博客-php&amp;MySQL实践
  5. linux tricks 之 BUILD_BUG_ON_ZERO.
  6. android_demo01
  7. ListView的item中有button和checkbox,listview的点击事件无效
  8. office 问题集
  9. uva 571 素数的性质
  10. C++ 虚函数表决心
  11. RxSwift 系列(一) -- Observables
  12. MSSQL 复制数据 并随机打乱写入
  13. [LeetCode] Set Mismatch 设置不匹配
  14. 关于extern的用法
  15. 关于APP测试的一点思考
  16. Hadoop源码分析(3): Hadoop的运行痕迹
  17. confluence部署与破解
  18. AJAX-DOM事件
  19. 深入了解preventDefault与stopPropagation
  20. 设置tab标签页 遮挡部分

热门文章

  1. docker confluence
  2. One Time Auth
  3. 如何对抗 WhatsApp「蓝色双勾」-- 3 个方法让你偷偷看讯息
  4. Tornado-简介
  5. 【C++】运算符重载
  6. Eclipse常用设置(转)
  7. angularjs 获取地址传参
  8. OC中@property属性关键字的使用(assign/weak/strong/copy)
  9. Python模块(scapy)
  10. 红帽Linux 配置VNC桌面远程工具