行ロック確認

 

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;