create table lock_test (
id int primary key,
name varchar2(32) not null,
age int not null
);
insert into lock_test(id,name, age) values(1,'tanaka', 20);
insert into lock_test(id,name, age) values(2,'suzuki', 30);
insert into lock_test(id,name, age) values(3,'sato', 40);
commit;
select * from lock_test;
--インデックスのないカラムで条件指定した場合
--tx1
UPDATE lock_test SET age = 21 WHERE name = 'tanaka';
--tx2
UPDATE lock_test SET age = 31 WHERE name = 'suzuki';
--ロック確認
select * from v$lock where type in ('TX','TM');
select * from v$locked_object;
--インデックスのあるカラムで条件指定した場合
--tx1
UPDATE lock_test SET age = 21 WHERE id = 1;
--tx2
UPDATE lock_test SET age = 31 WHERE id = 2;
いずれのケースでも行レベルでロックがかかっている
※インデックスのないカラムを条件指定して更新した場合、更新対象行以外もロックがかかる
http://bluerabbit.hatenablog.com/entry/2013/12/07/075759
create table lock_test (
id int primary key,
name varchar(32) not null,
age int not null
) engine=innoDB default charset=utf8;
insert into lock_test (id,name, age) values
(1,'tanaka', 20),
(2,'suzuki', 30),
(3,'sato', 40);
select * from lock_test;
--インデックスのないカラムで条件指定した場合
--tx1
flush status;
start transaction;
UPDATE lock_test SET age = 21 WHERE name = 'tanaka';
--tx2
flush status;
start transaction;
UPDATE lock_test SET age = 31 WHERE name = 'suzuki';
--ロック確認
show session status like 'Handler%';
SHOW ENGINE INNODB STATUS \G;
SELECT trx_rows_locked FROM information_schema.INNODB_TRX;
SELECT * FROM information_schema.INNODB_TRX\G
--インデックスのあるカラムで条件指定した場合
--tx1
flush status;
start transaction;
UPDATE lock_test SET age = 21 WHERE id = 1;
--tx2
flush status;
start transaction;
UPDATE lock_test SET age = 31 WHERE id = 2;
create table lock_test (
id int primary key,
name varchar(32) not null,
age int not null
);
insert into lock_test(id,name, age) values(1,'tanaka', 20);
insert into lock_test(id,name, age) values(2,'suzuki', 30);
insert into lock_test(id,name, age) values(3,'sato', 40);
select * from lock_test;
--インデックスのないカラムで条件指定した場合
--tx1
start transaction;
UPDATE lock_test SET age = 21 WHERE name = 'tanaka';
--tx2
start transaction;
UPDATE lock_test SET age = 31 WHERE name = 'suzuki';
--ロック確認
SELECT l.pid, db.datname, c.relname, l.locktype, l.mode, l.granted
FROM pg_locks l
LEFT JOIN pg_class c ON l.relation=c.relfilenode
LEFT JOIN pg_database db ON l.database = db.oid
ORDER BY l.pid;
--インデックスのあるカラムで条件指定した場合
--tx1
start transaction;
UPDATE lock_test SET age = 21 WHERE id = 1;
--tx2
start transaction;
UPDATE lock_test SET age = 31 WHERE id = 2;
いずれのケースでも行レベルでロックがかかっている
※インデックスのないカラムを条件指定して更新した場合、更新対象行以外もロックがかかる
create table lock_test (
id int primary key,
name varchar(32) not null,
age int not null
);
insert into lock_test(id,name, age) values(1,'tanaka', 20);
insert into lock_test(id,name, age) values(2,'suzuki', 30);
insert into lock_test(id,name, age) values(3,'sato', 40);
select * from lock_test;
--インデックスのないカラムで条件指定した場合
--tx1
begin transaction;
UPDATE lock_test SET age = 21 WHERE name = 'tanaka';
--tx2
begin transaction;
UPDATE lock_test SET age = 31 WHERE name = 'suzuki';
--ロック確認
SELECT * FROM sys.dm_tran_locks;
go
SELECT *
FROM sys.dm_tran_locks
WHERE resource_associated_entity_id
=(SELECT TOP 1 object_id FROM sys.partitions WHERE OBJECT_NAME(object_id)='lock_test');
go
--インデックスのあるカラムで条件指定した場合
--tx1
begin transaction;
UPDATE lock_test SET age = 21 WHERE id = 1;
--tx2
begin transaction;
UPDATE lock_test SET age = 31 WHERE id = 2;