Skip to content

Instantly share code, notes, and snippets.

@pokutuna
Created March 7, 2019 05:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pokutuna/52c157d5fb15a34aeb52c1a28055bf3a to your computer and use it in GitHub Desktop.
Save pokutuna/52c157d5fb15a34aeb52c1a28055bf3a to your computer and use it in GitHub Desktop.
gap lock dead lock rock you
#!/bin/sh
cat <<EOS | mysql -uroot
CREATE DATABASE IF NOT EXISTS lock_test;
USE lock_test;
DROP TABLE IF EXISTS example;
CREATE TABLE example (
id bigint unsigned NOT NULL,
name VARCHAR(10) NOT NULL,
count int NOT NULL,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id, name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
EOS
cat <<EOS > query1.sql
USE lock_test;
INSERT INTO example SET id = 1, name = 'hoge', count = 0;
INSERT INTO example SET id = 2, name = 'fuga', count = 0;
BEGIN;
\! echo 1: SELECT ... FOR UPDATE \(not exist\)
SELECT * FROM example WHERE id = 10 AND name = 'foo' FOR UPDATE;
\! echo 1: SELECT done
DO SLEEP(2);
\! echo 1: INSERT
INSERT INTO example SET id = 10, name = 'foo', count = 1 ON DUPLICATE KEY UPDATE count = count + 1, updated_at = CURRENT_TIMESTAMP;
\! echo 1: INSERT done
DO SLEEP(2);
COMMIT;
EOS
cat <<EOS > query2.sql
USE lock_test;
DO SLEEP(1);
BEGIN;
\! echo 2: SELECT ... FOR UPDATE \(not exist\)
SELECT * FROM example WHERE id = 7 AND name = 'bar' FOR UPDATE;
\! echo 2: SELECT done
\! echo 2: INSERT
INSERT INTO example SET id = 7, name = 'bar', count = 1 ON DUPLICATE KEY UPDATE count = count + 1, updated_at = CURRENT_TIMESTAMP;
\! echo 2: INSERT done
DO SLEEP(2);
COMMIT;
EOS
mysql -uroot -t -e 'source ./query1.sql' &
mysql -uroot -t -e 'source ./query2.sql' &
wait
echo '====='
cat <<EOS | mysql -uroot -t
USE lock_test;
SELECT * FROM example;
EOS
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment