在我們數據庫裏面,處理某些針對特定行的數據處理的時候, 例如書店裏有2本書,有3個人來借。 有一個訂單,多個人來搶。這個時候都需要用到行鎖。
舉例:
1. 創建數據庫:
CREATE TABLE `orders` (
`id` int(11) NOT NULL auto_increment,
`num` int(11) default NULL,
`name` varchar(10) default NULL,
PRIMARY KEY (`id`),
KEY `abc` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into orders(num) values(1),(1),(1),(1),(1);
insert into orders(num) values(2),(2),(2),(2),(2);
2. 行鎖例子:
begin;
select * from orders where id=3 and num=1 for update;
update orders set name='abc', num=0 where id=3 and num=1;
commit;
3. 可以啓動兩個session
session1裏面輸入
begin;
select * from orders where id=3 and num=1 for update;
begin;
select * from orders where id=3 and num=1 for update;
這個時候, session1裏面能執行下去,但是session2裏面會等待。
如果session1執行完畢,session2纔會執行。但是因爲session1裏面已經修改了num=0,因此session2裏面不能select到能修改的行。因此也就不能修改這一行了。