mysql行ロック
1131 ワード
私たちのデータベースでは、特定の行に対するデータ処理を処理するとき、例えば本屋に2冊の本があり、3人が借りに来ました.注文が一つあって、何人かが奪いに来た.このときはローロックが必要です.
例:
1.データベースの作成:
2.行ロックの例:
3.2つのセッションを開始できます
セッション1に入力
セッション2に入力
このとき、セッション1では実行できますが、セッション2では待機します.
セッション1の実行が完了すると、セッション2は実行されません.ただしsession 1ではnum=0が修正されているため、session 2では修正可能な行にselectすることはできません.そのため、この行を修正することはできません.
例:
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することはできません.そのため、この行を修正することはできません.