回答編集履歴
3
再アップ
answer
CHANGED
File without changes
|
2
typo
answer
CHANGED
@@ -73,7 +73,7 @@
|
|
73
73
|
```
|
74
74
|
上記の実際の処理順は
|
75
75
|
- (5,'xxx')を投入(その後wait)
|
76
|
-
- (5,'
|
76
|
+
- (5,'yyy')を投入(その後wait)
|
77
77
|
- id=5をチェックして、競合がないのでcommit
|
78
78
|
- id=5をチェックして、競合があるのでないのでrollback
|
79
79
|
|
1
テスト
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のみ投入されているのがわかります。
|