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语句,将得不到这种保护。