在我们数据库里面,处理某些针对特定行的数据处理的时候, 例如书店里有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到能修改的行。因此也就不能修改这一行了。