create table player ( id serial primary key, text varchar(20) ); create table item ( id BIGINT UNSIGNED primary key, text varchar(20) ); create table player_item ( id serial primary key, player BIGINT UNSIGNED NOT NULL, item BIGINT UNSIGNED NOT NULL, text varchar(20), FOREIGN KEY (player) REFERENCES Player(id), FOREIGN KEY (item) REFERENCES Item(id) ); update mysql.user set host='localhost' where user = 'user1'; update mysql.user set host='localhost' where user = 'user2'; grant all privileges on *.* to 'user1'@'localhost'; grant all privileges on *.* to 'user2'@'localhost'; insert into player (id, text) values (100,'player1'); insert into item (id, text) values (2000, 'item1'); insert into player_item (player, item) values (100, 2000); select * from player where id=100 for update; update player set text='player2' where id=100; create table player_item ( id serial primary key, player BIGINT UNSIGNED NOT NULL, item BIGINT UNSIGNED NOT NULL, text varchar(20), index idx_item (item), index idx_player (player), FOREIGN KEY (player) REFERENCES Player(id), FOREIGN KEY (item) REFERENCES Item(id) ); select * from player where id = 100 for update; insert into player_item (player, item) values (100, 2000); select * from item where id=2000 for update; create table player_token ( id serial primary key, token varchar(20) NOT NULL, item BIGINT UNSIGNED NOT NULL, unique key idx_token (token), index idx_item (item), FOREIGN KEY (id) REFERENCES Player(id), FOREIGN KEY (item) REFERENCES Item(id) ); insert into item (id, text) values (1000, 'item2'); insert into player (id, text) values (200,'player2'); insert into player_token (id, item, token) values (100, 1000, 'ABCD'); insert into player_token (id, item, token) values (200, 2000, 'ABCD'); select * from item where id = 2000 for update; select * from player where id = 200 for update;