下订单时,使用事务行锁,数据库同一时刻只能进行一个事务的处理?

xiasf
  • 1.9k

我看了这几篇文章:

  1. http://www.blogjava.net/loocky/archive/2006/11/15/81138.html

  2. http://blog.csdn.net/xifeijian/article/details/20313977

  3. http://betakoli.iteye.com/blog/2257095

  4. http://www.cnblogs.com/chenwenbiao/archive/2012/06/06/2537508.html

这上面几篇文章讲了 mysql InnoDB 的一些事务锁的使用,感觉里面都说到了下单时的减库存所定一行(FOR UPDATE)的这种情况,也就是说同一时刻,只能有一个下单的事务在执行,也就是说这是串行的?

这就跟去超市买东西结账时一张,收银员只能一个一个的结账,而我们只能提着篮子排队等着。

这是数据库的同一时刻是什么时间概念呢,同一秒,同一毫秒?还是根本就没有时间的概念,只是空间的概念,就是同一时空只有一个事务在执行,其它的排队等着吧?

计算机不就是为了解放人类的吗?那现在它这样和超市结账时要我们排队等着有什么分别呢?这样不显得Low吗?

那淘宝一秒钟上亿的成交,也是这样一个一个的“提交”订单的吗?如果是这样怎么可能一秒能有这么大的交易量呢?

另外再帮我看看这个问题:http://segmentfault.com/q/1010000004062810

谢谢了!

回复
阅读 7.3k
3 个回答

异步就可以解决你说的问题。
通过分布式和集群来开多条收费口。就可以解决你的问题了。

行锁,又不是表锁。另外都是微秒级的锁,为了保证acid就要加锁,不然就NoSQL

第一:行锁是只锁一行,并不是以时间为单位来锁定的,而是操作完成就释放,根据数据库的负载,数据量的情况这个操作时间不等的!这个时候有事物去操作其他行是不受影响的,所以一秒钟下很多单,只要不是操作同一条记录,只要服务器撑得住,是没任何问题的。
第二:像淘宝这样下这么多单,看过相关的技术介绍,大致分为两块,一是分库分表,像他们的订单表就分成1000多个库,每个库后面可以再做集群,这就是为什么每秒可以支撑那么多交易的强大支撑,二是有可能很多操作,操作成功不一定就立即持久化到数据库,有可能是中间缓存之类的,后端任务去持久化到数据库去。
这只是个人的一些理解,希望知道的大神斧正。

你知道吗?

宣传栏