技術とか戦略とか

SIerで証券レガシーシステムを8年いじってからSESに転職した普通の文系SEによる技術ブログ。

プログラミングにおけるトランザクションの基本的な考え方

情報処理技術者試験では「トランザクション」はデータベースにおける考え方の一つとして取り上げられていますが、実際にプログラミングを行う際にもトランザクションを意識することは重要になります。
画面でもバッチでも重要になります。
 
例えば銀行システムで送金する場合、以下のような操作が入ります。
①自分の口座の残金を減らす
②相手の口座の残金を増やす
この際、①の操作が成功し、②の操作が失敗した場合、①の操作を取り消さないと整合性が取れなくなります。
(自分の口座の残金が減るだけなんて嫌ですよね)
それを防ぐために、アプリケーション側で、「②の操作が失敗したら①の操作を取り消す」というロジック上の考慮が必要になります。
 
データベースを使っている場合、「②の操作が完了するまでコミットしない」「操作が途中で失敗したらロールバックする」というロジックにすることで、この考慮が可能になります。
フローチャートを書くと以下の通りです。

f:id:akira2kun:20200718164902j:plain

 
なお、使用しているデータベースによっては、オートコミットがONになっている場合があります。
オートコミットがONになっている場合、Insert/Update/Delete文を発行すると自動的にCommitが発行されてしまうので、トランザクション処理ではオートコミットを明示的にOFFにする必要があります。
例えば、JavaMysqlを使用している場合は、java.sql.ConnectionクラスのsetAutoCommitメソッドで引数にfalseを与えてオートコミットをOFFにする必要があります。