Hello World.
LiSMOtechの久津間です。
今回の記事では、Pythonを使ってトランザクション処理の実装例を紹介します。
経緯としては、先日、弊社内で研修を行っている際にトランザクション処理について説明する機会があり、pythonで実装例を書いてみようと。
また、以前の記事では「pythonでAWS RDSのMySQLに接続する方法」をご紹介しているので、合わせて確認してください!
トランザクション処理は、データベースや分散システムにおいて一連の操作をまとめて実行し、データの整合性や安全性を保つための手法です。
相互依存の関係にある複数の処理を1つの処理単位にまとめて、矛盾なく処理を行うことができます。
例えば、買取処理では、買取テーブルに買取数を入力すると、在庫テーブルに該当の商品の在庫数から同じ数だけプラスする、という2つの処理をまとめて一連の処理とする時です。
トランザクション処理では、一連の処理が全て成功するか、失敗した場合は処理が一つも実行されなかったかのように扱われ、データの整合性が保たれます。
この特性は、”ACID特性” と呼ばれ、トランザクション処理において重要な役割を果たします。
※ACID:原子性(Atomicity)」「一貫性(Consistency)」「独立性(Isolation)」「永続性(Durability)」の4つの特性が標準規格
プログラムを使ったトランザクション処理を行う場合は概ね以下の流れになるかと想定します。
1.トランザクションの開始
トランザクション処理を開始することをデータベースに通知・宣言します。
Mysqlだと「BEGIN」でトランザクション処理が開始されます。
2.操作の実行
トランザクション中に含まれる一連の処理を実行します。
矛盾なく、データの整合性や安全性を保ちたい処理を記載していくイメージです。
3.エラーの検出と対応
もし上記の処理中にエラーが発生した場合は、エラーに対応します。
ここで、必要に応じてトランザクションをロールバックまたは継続します。
4.トランザクションの確定(コミット)
すべての処理が正常に完了した場合、トランザクションの結果をコミットし、データベースに保存します。
5.トランザクションの終了
トランザクション処理が終了したことをデータベースに通知します。
Pythonでトランザクションの処理を実装してみます。
import mysql.connector
purchase_id = 1
item = '韓非子'
count = 1
# コネクションの作成
cox = mysql.connector.connect(
host='ホスト名を入力',
port='ポートを入力',
user='ユーザー名を入力',
password='パスワードを入力',
database='データベース名を入力'
)
# コネクションの状態を出力
print(cox.is_connected())
cursor = cox.cursor()
try:
# トランザクション開始
cursor.execute('BEGIN')
print('---トランザクションの処理開始しました')
# 買取テーブルを更新
cursor.execute("INSERT INTO purchase VALUE('', %s)", (item,))
# 在庫テーブルを更新
cursor.execute("UPDATE STOCK SET inventory = inventory + %s WHERE id = %s", (count,purchase_id,))
# コミット
cox.commit()
print("コミット完了")
except mysql.connector.Error as err:
print("Failed : {}".format(err))
# ロールバック
cox.rollback()
exit(1)
finally:
# コネクションを閉じる
cursor.close()
# トランザクション終了
cox.close()
今回の記事ではPyhonを使ったトランザクション処理について記載しました。
トランザクション処理を行うことでデータの整合性を保つことができます。
Pythonに限らず、その他の言語でも同様な処理を行う機会は多いので是非覚えておきましょう!
NEXTGATE LiSMOtechでは中小企業を中心にブランディング・WEBマーケティングを活用したWEB戦略を提供しています。
企業課題・問題に関するご相談、WEBサイト制作やグラフィックデザイン制作のクリエイティブに関するご相談やご質問、お見積りなどお気軽にお問い合わせください。
平日10:00〜19:00
© NEXTGATE LiSMOtech All rights reserved