mysql行ロック

1131 ワード

私たちのデータベースでは、特定の行に対するデータ処理を処理するとき、例えば本屋に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.2つのセッションを開始できます
セッション1に入力
begin; 
select * from orders where id=3 and num=1 for update; 

セッション2に入力
begin; 
select * from orders where id=3 and num=1 for update; 

このとき、セッション1では実行できますが、セッション2では待機します.
セッション1の実行が完了すると、セッション2は実行されません.ただしsession 1ではnum=0が修正されているため、session 2では修正可能な行にselectすることはできません.そのため、この行を修正することはできません.