質問するログイン新規登録

回答編集履歴

3

再アップ

2018/01/09 08:35

投稿

yambejp
yambejp

スコア118098

answer CHANGED
File without changes

2

typo

2018/01/09 08:35

投稿

yambejp
yambejp

スコア118098

answer CHANGED
@@ -73,7 +73,7 @@
73
73
  ```
74
74
  上記の実際の処理順は
75
75
  - (5,'xxx')を投入(その後wait)
76
- - (5,'xxx')を投入(その後wait)
76
+ - (5,'yyy')を投入(その後wait)
77
77
  - id=5をチェックして、競合がないのでcommit
78
78
  - id=5をチェックして、競合があるのでないのでrollback
79
79
 

1

テスト

2018/01/09 08:34

投稿

yambejp
yambejp

スコア118098

answer CHANGED
@@ -38,4 +38,44 @@
38
38
  ```SQL
39
39
  call add_tbl(4,'eee');
40
40
  select * from tbl;
41
- ```
41
+ ```
42
+
43
+ # transaction同士の競合テスト
44
+
45
+ ```SQL
46
+ drop procedure if exists add_tbl;
47
+ delimiter //
48
+ create procedure add_tbl(in in_id int,in_data varchar(10))
49
+ begin
50
+ start transaction;
51
+ insert into tbl values(in_id,in_data);
52
+ select sleep(5);
53
+ set @a:=(select count(*) from tbl where id=in_id);
54
+ if @a>=2 then
55
+ rollback;
56
+ else
57
+ commit;
58
+ end if;
59
+ end
60
+ //
61
+ ```
62
+
63
+ insert後に5秒待たせる処理をしてクロスした処理が競合するかチェックします
64
+ この処理は非同期ではないので、コンソールを2つひらいて投入します。
65
+
66
+ コンソールで
67
+ ```SQL
68
+ call add_tbl(5,'xxx');
69
+ ```
70
+ 別コンソールで
71
+ ```SQL
72
+ call add_tbl(5,'yyy');
73
+ ```
74
+ 上記の実際の処理順は
75
+ - (5,'xxx')を投入(その後wait)
76
+ - (5,'xxx')を投入(その後wait)
77
+ - id=5をチェックして、競合がないのでcommit
78
+ - id=5をチェックして、競合があるのでないのでrollback
79
+
80
+ 結果としてデータを確認すれば
81
+ 5,xxxのみ投入されているのがわかります。