Go言語とPostgreSQLで遊ぼう!~ Transaction編~

こんにちは。KOUKIです。

Go言語でアプリケーション開発手法を紹介しています。

前回は、CRUDのUnit Test作成について触れました。

今日は、Transactionについて学びたいと思います。

トランザクションとは

トランザクションを大まかに説明すると「DB操作のいくつかの処理を一つの処理としてまとめたもの」となります。

KOUKI
KOUKI

処理の一単位であり、
多くの場合、複数のdb操作で構成されます。


トランザクションを銀行の残高処理で例えてみましょう。

例として、太郎さんの口座から1万円を花子さんの口座に移すことになったとします。その時必要な処理の流れは、次のようになります。

処理の流れ 1. 太郎さんの口座残高から1万円移動させるレコードを作成
2. 太郎さんの口座残高から1万円引く
3. 花子さんの口座残高を1万円増やす
4. 花子さんの口座残高が1万円増えたレコードを作成

説明のため簡略化して書いていますが、実際はもっと複雑でしょう。しかし、トランザクションの必要性を知るには十分です。

トランザクションは、1~4の工程を単体で処理するのではなく、一つの処理としてまとめます。なぜなら、1~4の工程が独立して動くとどこかでエラーが発生した時処理をキャンセルすることができなくなるからです。

1~4の工程をトランザクションとしてまとめてしまえば、不測な事態が発生してもロールバックなどの対策が取れるというわけですね。

また、一単位の処理として扱えるということは、他のプログラムからの独立性が高い(影響を受けない)ことにも繋がります。goroutineを使ってトランザクション単位で処理を並行化し、処理速度を向上させることも可能なので、これもメリットになります。

トランザクション処理の実装

ファイルの準備

実装に必要なファイルを作成しましょう。

EntryとTransferテーブル操作

事前準備として、entry.sqlとtransfer.sqlにSQL文を追加し、テーブル操作をできるようにしておきます。

entry.sqlに次のSQL文を追加します。

transfer.sqlに次のSQL文を追加します。

次のコマンドで、SQL文からGoファイルを生成します。

このコマンドの詳細については、こちらの記事を参考にしてください。

Store structの作成

トランザクションを処理するためのStructを作成します。

トランザクション実行メソッド

先ほど作成したStore Structにトランザクションを実行するためのメソッドを追加します。

トランザクションデータのStruct化

処理をまとめる

最後に、先ほど作成したトランザクション実行メソッド(execTx)に「処理の塊を投げる」ための関数を作成しておきましょう。

execTxメソッドの第二パラメータが肝です。ここには関数を渡すことができ、トランザクションとしてまとめた処理の塊(処理1~4)を渡しています

テストコードの実装

前回学習したUnit Testをここでも書いていきましょう。

最初にmain_test.goを少し修正します。

DBのコネクション情報(testDB)を外出しして、他のファイルから呼び出すことができるようにします。※testDBと先頭が小文字のためプライベート扱いですが、同パッケージ内からは呼び出すことができます

次に、TransferTxメソッドのテストを実装します。

TransferTxのテストにgoroutineを使うところがミソですね。

goroutineで起動すれば実行時間を短くすることができますし、並列で実行しても問題ないことも確認できます。

テストをしてみましょう。

テストがパスしましたね。

長くなったので、ここまでにしましょう。

次回

トランザクション処理を実装できるようになれば、プログラミングスキルも一段階アップした感じがしますよね^^

私も自分のアプリケーションや会社のプログラムにこの技術を導入しようと思います。

次回は、デットロックについて学びましょう。

Go言語まとめ

オススメ書籍

コメントを残す