質問編集履歴

5

追記を加筆しました

2023/12/10 05:54

投稿

origa3
origa3

スコア22

test CHANGED
File without changes
test CHANGED
@@ -70,7 +70,7 @@
70
70
 
71
71
  こういう場合、どのように対処したらよろしいでしょうか?
72
72
 
73
- 入れ子の処理の方を`insert()` とは別の `insert2()` と分離しておき、その引数に「トランザクションを開くか否か」として`insert2($withTransaction)` のように対処することになるでしょうか?
73
+ 入れ子の処理の方を`insert()` とは別の `insert2()` と分離しておき、その引数に「トランザクションを開くか否か」として`insert2($withTransaction)` のように対処することになるでしょうか? ( `insert2()` を入れ子として実行するときは `$withTransaction` を `false` にし、単一で実行するときは `true` にするという意味です。 )
74
74
 
75
75
  これでいいのかと、経験が浅く不安が拭えません。
76
76
 

4

追記しました

2023/12/10 05:48

投稿

origa3
origa3

スコア22

test CHANGED
File without changes
test CHANGED
@@ -63,3 +63,16 @@
63
63
  PHP は 8.2 です。
64
64
  MySQL はやや古めで 5.7 です。
65
65
  よろしくお願い致します。
66
+
67
+ ### 追記
68
+ 改めて 5.7 のマニュアルを読んでみましたら 「> Transactions cannot be nested. 」との記載がございました…。
69
+ https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html
70
+
71
+ こういう場合、どのように対処したらよろしいでしょうか?
72
+
73
+ 入れ子の処理の方を`insert()` とは別の `insert2()` と分離しておき、その引数に「トランザクションを開くか否か」として`insert2($withTransaction)` のように対処することになるでしょうか?
74
+
75
+ これでいいのかと、経験が浅く不安が拭えません。
76
+
77
+ もし妙案ございましたらよろしくお願い致します。
78
+

3

誤字を訂正しました

2023/12/10 05:34

投稿

origa3
origa3

スコア22

test CHANGED
File without changes
test CHANGED
@@ -53,7 +53,7 @@
53
53
  }
54
54
  ```
55
55
 
56
- 再現可能なコード全体をこちらのリンクに置いておきました。よろしければお試し頂けますと幸いです。( 27~29 行目のデータベース接続情報だけ変更してください。)
56
+ 再現可能なコード全体をこちらのリンクに置いておきました。よろしければお試し頂けますと幸いです。( 21~23 行目のデータベース接続情報だけ変更してください。)
57
57
  https://3v4l.org/HivEd
58
58
 
59
59
  ### 試したこと

2

リンクを訂正しました

2023/12/10 05:33

投稿

origa3
origa3

スコア22

test CHANGED
File without changes
test CHANGED
@@ -54,7 +54,7 @@
54
54
  ```
55
55
 
56
56
  再現可能なコード全体をこちらのリンクに置いておきました。よろしければお試し頂けますと幸いです。( 27~29 行目のデータベース接続情報だけ変更してください。)
57
- https://3v4l.org/8JlSW
57
+ https://3v4l.org/HivEd
58
58
 
59
59
  ### 試したこと
60
60
  トランザクションを管理しているデータベース接続が同じだからかな?と思い上記の`$this->pdo`をやめて、`__construct()` で `$this->pdo1` と `$this->pdo2` を開き、外側を`$this->pdo1`に、入れ子を`$this->pdo2`に、と分けてみましたが変化は見らせませんでした。

1

コード内のコメントを訂正しました

2023/12/10 05:32

投稿

origa3
origa3

スコア22

test CHANGED
File without changes
test CHANGED
@@ -29,7 +29,7 @@
29
29
 
30
30
  // test_table2 の INSERT を実行
31
31
  $stmt2 = $this->pdo->prepare("INSERT INTO test_table2 (column2) VALUES (:value2)");
32
- $value2 = 'some_value_2'; // ここで Undefined エラーを起こす
32
+ $value2 = 'some_value_2';
33
33
  $stmt2->bindParam(':value2', $value2);
34
34
  $stmt2->execute();
35
35
 
@@ -47,7 +47,7 @@
47
47
  return "成功";
48
48
  } catch (\Exception $e) {
49
49
  // 外側のトランザクションのロールバック
50
- $this->pdo->rollBack();
50
+ $this->pdo->rollBack(); // この行でエラーが発生
51
51
  return "エラー: " . $e->getMessage();
52
52
  }
53
53
  }