アフィリエイト広告を利用しています
検索
<< 2024年11月 >>
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
最新記事
タグクラウド
カテゴリーアーカイブ
ファン
最新コメント
プロフィール
ゼロから始めるシステム開発さんの画像
ゼロから始めるシステム開発
 こんにちは!ナビゲータのEVEです。各種研究室を用意し、次期EVEシステムを製造しようと日々頑張っています。現在一番力を入れているのが、資金調達です。このブログもその一環ですので、ご協力いただければ嬉しいです。
プロフィール

2023年03月07日

トランザクション開始メソッド、プロセス確定メソッド、ロールバックメソッド [プロラム研究室]


 こんにちは!
 ナビゲータのEVEです。

 本日は、レコード追加処理の陰に隠れて、プログラムを紹介できなかった、トランザクション開始メソッド、コミットメソッド、ロールバックメソッドについて解説をしていきます。Prototype EVEの反省を受けて、新たなコンセプトを取り入れています。
 昨日のブログでも触れましたが、Prototype EVEでは、呼び出し元で、トランザクションの開始、コミット処理、ロールバックを行っていました。ただ、そのような処理だと、長いソースプログラムで適切にトランザクション関連処理が行われているかどうか目検確認するのが大変です。そのため、EVEシステムでは、クラス側で行おうとしています。

[レコード追加メソッドの解説]
 以下が、トランザクション開始メソッド、コミットメソッド、ロールバックメソッド、そして、デストラクタです。


//❶クラスパブリック変数定義
public $getDbConnect; //データベース接続オブジェクト
public $stmt; //ステートメント
public $processMessage; //処理メッセージ
public $setTran = "on"; //トランザクション開始プロパティ
//(on:開始前,exe:実行中,実行不可:off)
public $setCommit = ""; //コミットプロパティ(on:確定予約)

/*************************************************
*【メソッド名】トランザクション開始メソッド
*【 引 数 】
*【返 却 値】なし
*【製 造 者】EVE
*【製造年月日】2023年3月3日
*【更新年月日】
*【 概 要 】
* [2023/03/03]
* トランザクションを開始する
* トランザクションを開始したくない場合は、開始前に
*トランザクション開始プロパティにoffを設定
*************************************************/

//トランザクションを開始する
public function setTran() {
❷//トランザクション開始プロパティがオンになっているかどうか判定する
if ( $this->setTran == "on" ) {
//❸トランザクション開始プロパティがオンになっている場合
$this->getDbConnect->setAttribute(PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION);
//トランザクションを開始する
$this->getDbConnect->beginTransaction();

//❹トランザクション開始プロパティを実行中に変更する
$this->setTran = "exe";
}
}
/*************************************************
*【メソッド名】コミットメソッド
*【 引 数 】
*【返 却 値】なし
*【製 造 者】EVE
*【製造年月日】2023年3月3日
*【更新年月日】
*【 概 要 】
* [2023/03/03]
* 処理を確定する
*************************************************/

//データベースを確定する
public function setCommit() {
//❺コミットプロパティを判定する
if (( $this->setran == "exe" ) &&
( $this->setCommit == "on" )) {
//❻確定フラグが設定されている場合
$this->getDbConnect->commit();

//❼確定処理後確定処理前の状態に戻す
//トランザクション開始プロパティ(on:開始前,exe実行中)
$this->setTran = "on";

//コミットプロパティ(on:確定予約、"":未実施)
$this->setCommit = "";
}
}
/*************************************************
*【メソッド名】ロールバックメソッド
*【 引 数 】
*【返 却 値】なし
*【製 造 者】EVE
*【製造年月日】2023年3月6日
*【更新年月日】
*【 概 要 】
* [2023/03/06]
*トランザクションを発生した処理をロールバックする
*************************************************/

//データベースを確定する
public function setRollback() {
//❽コミットプロパティを判定する
if ( $this->setTran == "exe" ) {
//❾確定フラグが設定されている場合
$this->getDbConnect->rollBack();

//❿処理をトランザクション開始前の状態に戻す
//トランザクション開始プロパティ(on:開始前,exe実行中)

$this->setTran = "on";
//コミットプロパティ(on:確定予約)
$this->setCommit = "";
}
}
/*************************************************
*【メソッド名】デストラクタ
*【 引 数 】なし
*【返 却 値】なし
*【製 造 者】EVE
*【製造年月日】2023年3月2日
*【更新年月日】
*【 概 要 】
* オブジェクトが消滅する場合の処理を定義する
*************************************************/

//データベースを検索する
public function __destruct() {
//⓫処理が実行されている場合
if ( $this->setTran == "exe" ) {
//処理を確定する
//確定フラグが設定されている場合

$this->getDbConnect->commit();
}

//⓬データベースをクローズする
$this->getDbConnect = null;
}




独習PHP 第4版 [ 山田 祥寛 ]

価格:3,740円
(2023/3/7 19:38時点)
感想(1件)



❶には、DB関連クラス(getDB)のプロパティを記載しています。ここがこのクラスをコントロールする心臓部になります。なお、「独習PHP」に確か、クラスと分かるようにしたほうがいいとか、書いてあったような気がします。プログラム製造しているうちに、クラスなんだか、メソッドなのか、プロパティなのか分からなくなるような気がします。忠告には従った方がいいかもしれません。後日、「独習PHP」の助言に従って修正する予定です。
❷からは、トランザクション開始メソッドです。まず最初に、トランザクション開始プロパティを判定しています。DB関連クラス(getDB)のプロパティのトランザクション開始プロパティを見ていただければ分かりますが、デフォルトは"on"になっています。それは、Insert、Update、DeleteなどのDML(Data Manipulation Language)実行時には必ず、各処理の頭で実行するためデフォルトを"on"(開始)の状態にしています。但し、もしトランザクション処理を実行したくない場合は、"off"を設定することにより実行させない予定です。ただ、今までに、トランザクションを開始させないで、DMLを実行したことはなかったと思います。

 トランザクションを開始させないで、DMLを実行したことがないと書いていて思い出しましたが、2004年の開発当初は、トランザクションっていう機能が、MySQLにはありませんでした。トランザクション機能が追加されたのは、PHP4になってからだったよな・・・。その時、MySQLのバージョンいくつだっけな???機能追加するの大変だった記憶が思い出されます。
❸では、トランザクションを開始しています。
❹では、トランザクション開始プロパティを"exe"(実行中)にしています。このフラグにより、各メソッドはトランザクションの状態を判断します。
❺からは、コミットメソッドに入ります。❺では、トランザクション開始プロパティとコミットプロパティを判定しています。トランザクション開始プロパティは、"exe"(実行中)、コミットプロパティは"on"(確定予約)という状態になっているかどうか判定しています。"exe"(実行中)はトランザクション開始の時設定しており、それ以外では、設定していません。

 ここで書いていて気づきましたが、トランザクション開始プロパティの属性はpublicである必要はないですね・・・。使用目的から考えると、privateの方がいいような???このブログアップロード後修正します。
❻では、確定処理を実行しています。
❼では、トランザクション開始前の初期状態に、トランザクション開始プロパティ及びコミットプロパティを戻しています。確定が処理の最後ですから、初期状態に戻すでいいと思います。これ以降また、作成したプロパティを使用するかもしれませんし・・・?
❽からは、ロールバックメソッドとなります。ここでもコミットメソッド同様に、トランザクション開始プロパティを判定しています。
❾で、処理をロールバックしています。
❿では、コミットメソッドと同様に、トランザクション開始プロパティとコミットプロパティを初期化しています。
⓫からは、デストラクタになります。Javaにはない機能なのですが、PHPでは、インスタンスが消滅するときに、起動するメソッドになります。ここでは、トランザクション開始プロパティを判定し、"exe"実行中かどうか判定しています。プログラマとしてはありえないことなのですが、コミットまたはロールバックすることなくプログラムが終了した場合の、リスクヘッジです。
⓬では、データベースをクローズしています。

[あとがき]
 どうでしょうか?作ってみてプログラム開発当初に想像していたより、よくできたなって思っているのですが気のせいでしょうか?
 これで、プログラム開発が楽になるような気がしています。

 では、また!!!
この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/11894624
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック