回答編集履歴

3

再アップ

2018/01/09 08:35

投稿

yambejp
yambejp

スコア114843

test CHANGED
File without changes

2

typo

2018/01/09 08:35

投稿

yambejp
yambejp

スコア114843

test CHANGED
@@ -148,7 +148,7 @@
148
148
 
149
149
  - (5,'xxx')を投入(その後wait)
150
150
 
151
- - (5,'xxx')を投入(その後wait)
151
+ - (5,'yyy')を投入(その後wait)
152
152
 
153
153
  - id=5をチェックして、競合がないのでcommit
154
154
 

1

テスト

2018/01/09 08:34

投稿

yambejp
yambejp

スコア114843

test CHANGED
@@ -79,3 +79,83 @@
79
79
  select * from tbl;
80
80
 
81
81
  ```
82
+
83
+
84
+
85
+ # transaction同士の競合テスト
86
+
87
+
88
+
89
+ ```SQL
90
+
91
+ drop procedure if exists add_tbl;
92
+
93
+ delimiter //
94
+
95
+ create procedure add_tbl(in in_id int,in_data varchar(10))
96
+
97
+ begin
98
+
99
+ start transaction;
100
+
101
+ insert into tbl values(in_id,in_data);
102
+
103
+ select sleep(5);
104
+
105
+ set @a:=(select count(*) from tbl where id=in_id);
106
+
107
+ if @a>=2 then
108
+
109
+ rollback;
110
+
111
+ else
112
+
113
+ commit;
114
+
115
+ end if;
116
+
117
+ end
118
+
119
+ //
120
+
121
+ ```
122
+
123
+
124
+
125
+ insert後に5秒待たせる処理をしてクロスした処理が競合するかチェックします
126
+
127
+ この処理は非同期ではないので、コンソールを2つひらいて投入します。
128
+
129
+
130
+
131
+ コンソールで
132
+
133
+ ```SQL
134
+
135
+ call add_tbl(5,'xxx');
136
+
137
+ ```
138
+
139
+ 別コンソールで
140
+
141
+ ```SQL
142
+
143
+ call add_tbl(5,'yyy');
144
+
145
+ ```
146
+
147
+ 上記の実際の処理順は
148
+
149
+ - (5,'xxx')を投入(その後wait)
150
+
151
+ - (5,'xxx')を投入(その後wait)
152
+
153
+ - id=5をチェックして、競合がないのでcommit
154
+
155
+ - id=5をチェックして、競合があるのでないのでrollback
156
+
157
+
158
+
159
+ 結果としてデータを確認すれば
160
+
161
+ 5,xxxのみ投入されているのがわかります。