Created
March 7, 2019 05:12
-
-
Save pokutuna/52c157d5fb15a34aeb52c1a28055bf3a to your computer and use it in GitHub Desktop.
gap lock dead lock rock you
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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