Javaのトランザクションパラメータがどのように動作するか
Javaでは、トランザクションの属性を指定するには@Transactionalアノテーションを使用します。@Transactionalアノテーションは、クラスレベルまたはメソッドレベルに適用できます。
@Transactionalアノテーションを使用する際に指定できるプロパティの一部を以下に示します。
- 伝播: 指定されたトランザクションの伝播動作。デフォルト値はPropagation.REQUIREDで、これは現時点でトランザクションがない場合、新しいトランザクションを作成し、トランザクションがすでに存在する場合、そのトランザクションに参加して実行することを意味します。他のオプション値には、Propagation.REQUIRES_NEW、Propagation.SUPPORTS、Propagation.NOT_SUPPORTED などがあります。
- アイソレーション: 指定されたトランザクションのアイソレーションレベル。デフォルトは、Isolation.DEFAULTで、これはデータベースのデフォルトのアイソレーションレベルを使用することを意味します。READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ、SERIALIZABLEなど、その他のオプションの値はあります。
- readOnly: トランザクションが読み取り専用かどうかを指定します。デフォルトは false で、トランザクションはデータの読み取りと変更を行うことができます。true に設定すると、トランザクションはデータの読み取りのみを行い、変更することはできません。
- タイムアウト:トランザクションのタイムアウト時間を秒で指定します。トランザクションが指定された時間内に完了しなかった場合、トランザクションは自動的にロールバックされます。
- ロールバックする例外タイプと、ロールバックしない例外タイプを指定します。複数の例外タイプを指定することもできます。
次に、@Transactional アノテーションを使った例を示します。
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED, readOnly = false, timeout = 10, rollbackFor = Exception.class)
public void doSomething() {
// 事务操作代码
}
上のサンプルでは、doSomething() メソッドはトランザクションとしてマークされており、トランザクションの属性は次の通りです: 伝播動作Propagation.REQUIRED、分離レベルIsolation.READ_COMMITTED、読み取り専用false、タイムアウト時間10秒、ロールバック例外タイプException。