質問編集履歴

1

コード追加

2019/02/07 13:20

投稿

saya24
saya24

スコア222

test CHANGED
File without changes
test CHANGED
@@ -17,3 +17,135 @@
17
17
 
18
18
 
19
19
  ご見解をよろしくお願い致します。
20
+
21
+
22
+
23
+
24
+
25
+ 【追記】:
26
+
27
+ 複数テーブルを結合するためのIDを、自動採番属性の項目=IDを利用した番号管理テーブルから採取、そして各テーブルへの利用を検討しました。lastInsertIdを用いて...と考えていました。しかし自身のトランザクションで取得したIDを戻すとは限らない、との調査結果から、やはり自身のコーディングでIDを取得する(番号管理テーブル上の最終番号を繰り上げてこれを利用する)方針へ切替えようとしています。
28
+
29
+
30
+
31
+ 新たな疑問として(というか前回の問合せ内容に戻ってしまいましたが)以下コーディングの★印マークの3ステップの合間に、他トランザクション(自身以外)が同時刻に処理した場合、重複した番号を採取しないか疑問・不安を抱いています。同一トランザクション内で処理したとしても、同時刻に複数ユーザがいる状況下では 2ステップ目で同じ番号をSELECTが払出すような気がし、3ステップ目では同じ番号を更新しにいくような気がします。相応の工夫が必要と思うのですが、重複しないようにどういう手立てをとればよいのでしょうか?
32
+
33
+
34
+
35
+ ```PHP
36
+
37
+ function initial($BIID) {
38
+
39
+ try {
40
+
41
+
42
+
43
+ //DBへ接続 【php_etc/dbconnect.phpに接続先は書いてあります】
44
+
45
+ $err_stage = "err#051";
46
+
47
+ $db = new ms0connect();
48
+
49
+ $conn = $db->dbconnect();
50
+
51
+ $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
52
+
53
+ $conn->beginTransaction();
54
+
55
+
56
+
57
+ //☆★☆★
58
+
59
+ $err_stage = "err#052";
60
+
61
+ $SQL = "SELECT TOP 1 FINALSEQ FROM ATOZ_FINALSEQ WHERE SYSTEMTYPE='".$BIID."'";
62
+
63
+ $stmt=$conn->prepare($SQL);
64
+
65
+ $stmt->execute();
66
+
67
+
68
+
69
+ $row = null;
70
+
71
+ $row = $stmt->fetch(PDO::FETCH_ASSOC);
72
+
73
+ if ($row == null) {
74
+
75
+ $err_stage = "err#054";
76
+
77
+ throw new Exception();
78
+
79
+ } else {
80
+
81
+ $appno = $row["FINALSEQ"] + 1; //ワーク上で1を繰り上げる
82
+
83
+ }
84
+
85
+
86
+
87
+ $err_stage = "err#053";
88
+
89
+ $SQL = "UPDATE ATOZ_FINALSEQ SET FINALSEQ=".$appno." WHERE SYSTEMTYPE='".$BIID."'"; //繰り上げられた最終番号を更新する
90
+
91
+ $conn->exec($SQL);
92
+
93
+ //☆★☆★
94
+
95
+
96
+
97
+ $err_stage = "err#055";
98
+
99
+ $SQL = "INSERT ATOZ_PLNROUT
100
+
101
+ SELECT A.BIID, A.ORNO, A.FIN, '".$appno."' AS WID, A.STID, B.STNAME, A.USEDPT, NULL AS ACTOP FROM V_ATOZ_BIROUT A LEFT OUTER JOIN
102
+
103
+ (SELECT STID, MAX(STNAME) AS STNAME FROM V_ATOZ_STAGE GROUP BY STID) B
104
+
105
+ ON B.STID=A.STID WHERE A.BIID='".$BIID."'";
106
+
107
+ $stmt=$conn->prepare($SQL);
108
+
109
+ $stmt->execute();
110
+
111
+
112
+
113
+
114
+
115
+ $err_stage = "err#056";
116
+
117
+ $SQL = "INSERT ATOZ_PLNSTAGE
118
+
119
+ SELECT '".$BIID."' AS BIID, '".$appno."' AS WID, A.STID, A.DPTID, A.STNAME, A.USERID, A.SUB, A.USEEXTCON, A.EXTCON FROM V_ATOZ_STAGE A
120
+
121
+ WHERE A.STID IN (SELECT DISTINCT STID FROM V_ATOZ_BIROUT WHERE BIID='".$BIID."')";
122
+
123
+ $stmt=$conn->prepare($SQL);
124
+
125
+ $stmt->execute();
126
+
127
+
128
+
129
+ $conn->commit();
130
+
131
+ $err_stage = null;
132
+
133
+
134
+
135
+ } catch (PDOException $e) {
136
+
137
+ error_log("### SQL Serverデータ取得失敗 ⇒".$SQL."###".$e->getMessage(),0);
138
+
139
+ } catch (Exception $e) {
140
+
141
+ error_log("### SQL Serverデータ取得失敗 ⇒".$SQL."###".$e->getMessage(),0);
142
+
143
+ }
144
+
145
+ $conn = null;
146
+
147
+ return $err_stage;
148
+
149
+ }
150
+
151
+ ```