今回はPlay Framework(以降play)のトランザクション制御方法を紹介します。
記事の作成にはPlay Framework 1.x系を使用しています。
playについては参考サイトの「生産性の高いJava WEBフレームワーク Play Framework」をご参照ください。
■トランザクションの範囲
playはデータベース接続の設定をしておくと、HTTPリクエストがあった時に自動でデータベース接続を開きトランザクションを開始します。
アクションの処理が完了し、HTTPレスポンスを返す時に自動的にコミットされ、データベース接続が閉じられます。
大体においてコントローラのアクション内がトランザクションの範囲という事です。
■ロールバックの方法1
アクションの処理中に問題が発生して、データベース更新処理を取り消したい事があると思います。
そういう時には下記のメソッドを使い、コミットをしないようにできます。
play.db.jpa.JPA.setRollbackOnly()
「setRollbackOnly」メソッドを呼び出すと、HTTPレスポンスを返す時のコミットが行われないようになります。
気をつけなければいけないのは、既にデータの更新処理を行っている場合に、HTTPレスポンスを返すまでは更新した分のデータが取得できてしまう点です。
「setRollbackOnly」を呼び出した時点でロールバックされる訳ではないので注意です。
■ロールバックの方法2
アクションの処理中に例外が発生し、その例外をキャッチしない場合にもロールバックされます。
例外をキャッチしてアクション内で処理を完了させると通常通りコミットされます。
■コミット行わないようにする方法
下記のアノテーションをアクションもしくはコントローラにつける事によって、HTTPレスポンスを返す際のコミットが行われないようにする事ができます。
@play.db.jpa.Transactional(readOnly=true)
コントローラにつけたらコントローラ全体に、アクションにつけたらそのアクションのみに適用されます。
こちらも気をつけなければいけない点があり、「readOnly」プロパティを設定しても更新処理自体は普通に行えます。
結果としてロールバックの方法1と同じようにHTTPレスポンスを返すまでは更新した分のデータは取得できてしまいます。
■トランザクションを開始しないようにする方法
トランザクションの制御とは違いますが、下記のアノテーションをアクションもしくはコントローラにつける事によって、トランザクション(データベース接続)を開始しないようにする事ができます。
@play.db.jpa.NoTransaction
データベースへの接続自体が開始されないので、データベースへの処理を行った時に例外が発生するので注意してください。
データベースへ接続しない分、処理が軽くなるようです。
■その他の方法
playが管理しているデータベース接続を取得して直接トランザクションを制御する方法もあります。
下記のメソッドでデータベース接続を取得する事ができます。
play.db.DB.getConnection()
返り値は「java.sql.Connection」インターフェイスです。
後はインターフェイスの実装によりロールバック、コミットができる他、普通のSQLを使用する事もできます。
コストなどの関係でデータベースの制御を細かく行いたい場合、こちらの方法が有用かも知れません。
「Connection」でデータベースなどを操作しても、最終的にHTTPレスポンスを返す時に行われる自動コミットはそのまま行われるので、意図しない不具合がでないようにコミットとロールバックには気をつけてください。
■まとめ
今回は公式の記事では簡単にしか触れられていないトランザクション制御について紹介してみました。
playでは予めドライバが用意されているH2、MySQLであれば設定を一行変えるだけで簡単に接続できます。
面倒なデータベース接続やトランザクションの処理も自動化されていて、特に意識する必要もありません。
興味がありましたら是非一度使ってみる事をお勧めします。
■参考サイト
生産性の高いJava WEBフレームワーク Play Framework
Play Framework トランザクション管理
システム構築に関してのご依頼、ご質問等がある場合は弊社ホームページ上のお問い合わせフォームもしくは下記連絡先までお問い合わせ下さい。
株式会社ヴィンテージ
TEL:093-513-7255