質問編集履歴
3
修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -74,13 +74,7 @@
|
|
74
74
|
|
75
75
|
// wp_fruits1 を保存
|
76
76
|
|
77
|
-
$table = 'wp_fruits1';
|
78
|
-
|
79
|
-
$data = $fruits_datas['fruits1'];
|
80
|
-
|
81
|
-
$format = ['%s'];
|
82
|
-
|
83
|
-
$fruits1 = $wpdb->insert(
|
77
|
+
$fruits1 = $wpdb->insert( 'wp_fruits1', $fruits_datas['fruits1'], ['%s'] );
|
84
78
|
|
85
79
|
if( ! $fruits1 ){
|
86
80
|
|
@@ -94,13 +88,7 @@
|
|
94
88
|
|
95
89
|
// wp_fruits2 を保存
|
96
90
|
|
97
|
-
$table = 'wp_fruits2';
|
98
|
-
|
99
|
-
$data = $fruits_datas['fruits2'];
|
100
|
-
|
101
|
-
$format = ['%s'];
|
102
|
-
|
103
|
-
$fruits2 = $wpdb->insert(
|
91
|
+
$fruits2 = $wpdb->insert( 'wp_fruits2', $fruits_datas['fruits2'], ['%s'] );
|
104
92
|
|
105
93
|
if( ! $fruits2 ){
|
106
94
|
|
@@ -180,13 +168,7 @@
|
|
180
168
|
|
181
169
|
// wp_vegetables1 を保存
|
182
170
|
|
183
|
-
$table = 'wp_vegetables1';
|
184
|
-
|
185
|
-
$data = $vegetable_datas['vegetables1'];
|
186
|
-
|
187
|
-
$format = ['%s'];
|
188
|
-
|
189
|
-
$vegetables1 = $wpdb->insert(
|
171
|
+
$vegetables1 = $wpdb->insert( 'wp_vegetables1', $vegetable_datas['vegetables1'], ['%s'] );
|
190
172
|
|
191
173
|
if( ! $vegetables1 ){
|
192
174
|
|
@@ -200,13 +182,7 @@
|
|
200
182
|
|
201
183
|
// wp_vegetables2 を保存
|
202
184
|
|
203
|
-
$table = 'wp_vegetables2';
|
204
|
-
|
205
|
-
$data = $vegetable_datas['vegetables2'];
|
206
|
-
|
207
|
-
$format = ['%s'];
|
208
|
-
|
209
|
-
$vegetables2 = $wpdb->insert(
|
185
|
+
$vegetables2 = $wpdb->insert( 'wp_vegetables2', $vegetable_datas['wp_vegetables2'], ['%s'] );
|
210
186
|
|
211
187
|
if( ! $vegetables2 ){
|
212
188
|
|
2
コード誤字訂正
test
CHANGED
File without changes
|
test
CHANGED
@@ -18,11 +18,11 @@
|
|
18
18
|
|
19
19
|
|
20
20
|
|
21
|
-
さて以下
|
21
|
+
さて以下5行目の`$val`は、子関数の最後に更新される`wp_vegetables2`テーブルを更新する値ですが、ここを`CREATE`で設定した`VARCHAR(3)`以上の文字にしてエラーを起こしてみました。
|
22
|
-
|
23
|
-
|
24
|
-
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
-
しかし`ROLLBACK`が効くのは子関数で`LOCK TABLES`をかけた`wp_vegetables1`と`wp_vegetables2`だけでし
|
25
|
+
しかし`ROLLBACK`が効くのは子関数で`LOCK TABLES`をかけた`wp_vegetables1`と`wp_vegetables2`だけで、`wp_fruits1`と`wp_fruits2`はINSERTが成功してしまうのです。
|
26
26
|
|
27
27
|
|
28
28
|
|
@@ -112,6 +112,8 @@
|
|
112
112
|
|
113
113
|
|
114
114
|
|
115
|
+
// 以下の子関数でエラーが出たとき、親関数を ROLLBACK させたい
|
116
|
+
|
115
117
|
$vegetable_ids = my_insert_wp_vegetables($vegetable_datas);
|
116
118
|
|
117
119
|
if( isset($vegetable_ids['error']) ){
|
@@ -126,7 +128,7 @@
|
|
126
128
|
|
127
129
|
|
128
130
|
|
129
|
-
|
131
|
+
// 問題なければ
|
130
132
|
|
131
133
|
$result = ['fruits1_id'=>$fruits1_id,'fruits2_id'=>$fruits2_id];
|
132
134
|
|
@@ -136,21 +138,21 @@
|
|
136
138
|
|
137
139
|
|
138
140
|
|
139
|
-
|
141
|
+
} catch (Exception $e) {
|
140
142
|
|
141
143
|
$wpdb->query('ROLLBACK');
|
142
144
|
|
143
|
-
|
145
|
+
$result['error'] = $e->getMessage();
|
144
|
-
|
146
|
+
|
145
|
-
|
147
|
+
} finally {
|
146
|
-
|
148
|
+
|
147
|
-
|
149
|
+
$wpdb->query('UNLOCK TABLES');
|
148
|
-
|
150
|
+
|
149
|
-
|
151
|
+
}
|
150
|
-
|
151
|
-
|
152
|
-
|
152
|
+
|
153
|
+
|
154
|
+
|
153
|
-
|
155
|
+
return $result;
|
154
156
|
|
155
157
|
}
|
156
158
|
|
@@ -170,9 +172,9 @@
|
|
170
172
|
|
171
173
|
|
172
174
|
|
173
|
-
|
175
|
+
$result = null;
|
174
|
-
|
176
|
+
|
175
|
-
|
177
|
+
try {
|
176
178
|
|
177
179
|
|
178
180
|
|
@@ -228,21 +230,21 @@
|
|
228
230
|
|
229
231
|
|
230
232
|
|
231
|
-
|
233
|
+
} catch (Exception $e) {
|
232
234
|
|
233
235
|
$wpdb->query('ROLLBACK');
|
234
236
|
|
235
|
-
|
237
|
+
$result['error'] = $e->getMessage();
|
236
|
-
|
238
|
+
|
237
|
-
|
239
|
+
} finally {
|
238
|
-
|
240
|
+
|
239
|
-
|
241
|
+
$wpdb->query('UNLOCK TABLES');
|
240
|
-
|
242
|
+
|
241
|
-
|
243
|
+
}
|
242
|
-
|
243
|
-
|
244
|
-
|
244
|
+
|
245
|
+
|
246
|
+
|
245
|
-
|
247
|
+
return $result;
|
246
248
|
|
247
249
|
}
|
248
250
|
|
1
加筆
test
CHANGED
File without changes
|
test
CHANGED
@@ -40,7 +40,7 @@
|
|
40
40
|
|
41
41
|
// 実行
|
42
42
|
|
43
|
-
$val = 'val'; // ここを VARCHAR(3) 以上の文字にしてエラーを起こしても、wp_fruits1 と wp_fruits2 は
|
43
|
+
$val = 'val'; // ここを VARCHAR(3) 以上の文字にしてエラーを起こしても、wp_fruits1 と wp_fruits2 は ROLLBACK が効かない
|
44
44
|
|
45
45
|
$fruits_datas = [ 'fruits1'=>['col'=>'val'], 'fruits2'=>['col'=>'val'] ];
|
46
46
|
|
@@ -52,9 +52,9 @@
|
|
52
52
|
|
53
53
|
|
54
54
|
|
55
|
-
// wp_fruits1 と wp_fruits2 を INSERT
|
55
|
+
// 親関数 ( wp_fruits1 と wp_fruits2 を INSERT )
|
56
|
-
|
56
|
+
|
57
|
-
function my_insert_wp_fruits($fruits_datas,$vegetable_datas){
|
57
|
+
function my_insert_wp_fruits($fruits_datas,$vegetable_datas=[]){
|
58
58
|
|
59
59
|
global $wpdb;
|
60
60
|
|
@@ -156,7 +156,7 @@
|
|
156
156
|
|
157
157
|
|
158
158
|
|
159
|
-
// wp_vegetables1 と wp_vegetables2 を INSERT
|
159
|
+
// 子関数 ( wp_vegetables1 と wp_vegetables2 を INSERT )
|
160
160
|
|
161
161
|
function my_insert_wp_vegetables($vegetable_datas){
|
162
162
|
|
@@ -281,3 +281,47 @@
|
|
281
281
|
|
282
282
|
|
283
283
|
```
|
284
|
+
|
285
|
+
###試したこと
|
286
|
+
|
287
|
+
自分なりの解決策としては、親関数の方で、「もし子関数を更新するならLOCK TABLESを追加」というコードを下記のように加える方法ですが…
|
288
|
+
|
289
|
+
|
290
|
+
|
291
|
+
こういった方法よりも、親関数にさかのぼって`ROLLBACK`させたいと思っています。
|
292
|
+
|
293
|
+
|
294
|
+
|
295
|
+
ご指導宜しくお願い申し上げます。
|
296
|
+
|
297
|
+
```php
|
298
|
+
|
299
|
+
function my_insert_wp_fruits($fruits_datas,$vegetable_datas=[]){
|
300
|
+
|
301
|
+
global $wpdb;
|
302
|
+
|
303
|
+
$wpdb->query('SET autocommit=0');
|
304
|
+
|
305
|
+
$sql = "LOCK TABLES wp_fruits1 WRITE, wp_fruits2 WRITE";
|
306
|
+
|
307
|
+
|
308
|
+
|
309
|
+
// もし子関数を更新するならLOCK TABLESを追加
|
310
|
+
|
311
|
+
if( !empty($vegetable_datas) ){
|
312
|
+
|
313
|
+
$sql .= ",wp_vegetables1 WRITE, wp_vegetables2 WRITE"
|
314
|
+
|
315
|
+
}
|
316
|
+
|
317
|
+
|
318
|
+
|
319
|
+
$wpdb->query($sql);
|
320
|
+
|
321
|
+
|
322
|
+
|
323
|
+
// 以下同じ
|
324
|
+
|
325
|
+
}
|
326
|
+
|
327
|
+
```
|