版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出版、作者信息和本声明。否则将追究法律责任。http://blog.csdn.net/mayongzhan - 马永占,myz,mayongzhan
SELECT * FROM myz FOR UPDATE; 在innoDB下使用. 在start transaction和commit/rollback中间使用 只锁定被选择行 (要有主键,并且明确表明在操作哪个主键),未指明或无主键则锁表 必须在事务中使用.在rollback或者commit后,锁定的内容才可以使用
FOR UPDATE的这些特性可以被应用在类似银行的系统上
比如一个银行帐户.有1000元 在taobao上消费的同时在tenpay上消费.那么 在taobao上消费金额100,在tenpay上消费金额150.不使用for update的话.可能会产生只消费一次的情况.
过程: Taobao花100元,银行取出1000(步骤一),然后减去100(步骤二),然后.把900存回(步骤三). Tenpay花150元,银行取出900(步骤一),然后减去150(步骤二) ,然后.把750存回(步骤三). 看上去没有错误,但是有可能在taobao的第二步第三步之间的时候,tenpay进行第一步…那么tenpay取到的就是1000,然后减去150,钱是850就是少消费了一次.这当然是不行的.
所以这时FOR UPDATE就该派上用场了.taobao操作的时候for update 锁定操作的那行.然后等taobao操作完成后.tenpay才可以执行第一步.