[转载]mysql事务(2)

UPDATE book SET book_numberbook_number = book_number - 1 WHERE book_id = 123;  

COMMIT;  

答案是否定了,这样依然不能避免问题的发生,如果想避免这样的情况,实际应该如下:

BEGIN;  

SELECT book_number FROM book WHERE book_id = 123 FOR UPDATE;  

// ...  

UPDATE book SET book_numberbook_number = book_number - 1 WHERE book_id = 123;  

COMMIT;  

由于加入了FOR UPDATE,所以会在此条记录上加上一个行锁,如果此事务没有完全结束,那么其他的事务在使用SELECT ... FOR UPDATE请求的时候就会处于等待状态,直到上一个事务结束,它才能继续,从而避免了问题的发生,需要注意的是,如果你其他的事务使用的是不带FOR UPDATE的SELECT语句,将得不到这种保护。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/11233.html