アプリケーションでは、トランザクション管理は非常に重要な概念です。トランザクションは、すべてが成功するか、すべてが失敗する一連の操作です。Spring Boot では、トランザクション アノテーションを使用してトランザクションを管理できます。トランザクション アノテーションを使用する場合、非常に重要な概念はトランザクションの伝播動作です。
トランザクションの伝播動作とは何ですか
トランザクションの伝播動作とは、あるメソッドが別のメソッドを呼び出したときにどのようなトランザクション動作が発生するかを指します。Spring Boot では、トランザクションの伝播動作は Spring フレームワークによって管理されます。Spring フレームワークは、いくつかのルールを使用して、さまざまな状況でトランザクションを処理する方法を決定します。
Spring Boot のトランザクション アノテーション
Spring Boot は、@Transactional
トランザクションを制御するためのアノテーションを提供します。このアノテーションはメソッドまたはクラスに配置できます。クラスに配置された場合、すべてのメソッドはこのアノテーションを継承します。
@Transactional
propagation
注釈には、や などの非常に重要なプロパティがいくつかありますisolation
。propagation
属性はトランザクションの伝播動作を指定するために使用され、isolation
属性はトランザクションの分離レベルを指定するために使用されます。
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
public void doSomething() {
// ...
}
上記のコードでは、propagation
属性はトランザクションの伝播の動作を指定しますPropagation.REQUIRED
。これは、トランザクションがすでに存在する場合はこのトランザクションを使用し、現在のトランザクションが存在しない場合は新しいトランザクションを作成することを意味します。isolation
この属性は、トランザクションの分離レベルを指定しますIsolation.READ_COMMITTED
。これは、コミットされたデータの読み取りを意味します。
Spring Boot のトランザクション原則
Spring Boot では、トランザクションは Spring フレームワークによって管理されます。Spring フレームワークは、AOP (アスペクト指向プログラミング) テクノロジーを使用してトランザクション管理を実装します。具体的には、Spring フレームワークはプロキシ メカニズムを通じてトランザクション管理を実装します。
メソッドに@Transactional
アノテーションが付けられると、Spring はそのメソッドのプロキシ オブジェクトを作成します。このメソッドが呼び出されると、実際にはプロキシ オブジェクトのメソッドが呼び出されます。プロキシオブジェクトはメソッド実行前にトランザクションを開始し、メソッド実行後に実行結果に応じてトランザクションをコミットするかロールバックするかを決定します。
Spring フレームワークはTransactionInterceptor
インターセプターを使用してトランザクション管理を実装します。このインターセプタはメソッドの実行前後をインターセプトし、トランザクションの伝播動作や異常状況に応じて新規トランザクションをオープンするか既存のトランザクションを使用するかを判断し、実行結果に応じてトランザクションをコミットするか返すかを決定します。メソッドが実行された後、廃業してください。
Spring Boot でのトランザクションの使用法
Spring Boot では、@Transactional
アノテーションを使用してトランザクションを制御できます。アノテーションを使用する場合は@Transactional
、次の点に注意する必要があります。
@Transactional
注釈はパブリック メソッドにのみ配置できます。- メソッドは非静的である必要があります。
- 注釈付きメソッドが同じクラスで呼び出された場合、
@Transactional
トランザクションは機能しません。これは、Spring がプロキシを介してトランザクション管理を実装しており、プロキシはメソッドが呼び出された場合にのみ有効になるためです。 - 複数のアノテーション付きメソッドがクラス内に同時に存在する場合
@Transactional
、これらのメソッドは同じトランザクションを共有します。 - アノテーションを使用する場合は
@Transactional
、アノテーションが正しく構成されていることを必ず確認してください。構成されていないと、トランザクションがロールバックされないか、ロールバックが不完全になる可能性があります。
アノテーションを使用した例を次に示します@Transactional
。
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Transactional(rollbackFor = Exception.class)
public void addUser(User user) {
userRepository.save(user);
// ...
## 代码解读
在上面的代码中,我们定义了一个`UserService`类,这个类使用了`@Transactional`注解来控制事务。在`addUser`方法中,我们首先调用了`userRepository.save(user)`方法来保存用户信息。由于这个方法上使用了`@Transactional`注解,因此在调用`userRepository.save(user)`方法之前,Spring框架会开启一个事务。如果在`userRepository.save(user)`方法执行期间发生了异常,那么这个事务将会被回滚。
`@Transactional`注解还有一些其他的属性,包括`readOnly`、`timeout`和`noRollbackFor`等。这些属性可以帮助我们更好地控制事务的行为。例如,`readOnly`属性可以指定事务是否为只读事务;`timeout`属性可以指定事务超时时间;`noRollbackFor`属性可以指定哪些异常不应该回滚事务。
```java
@Transactional(readOnly = true, timeout = 30, noRollbackFor = IllegalArgumentException.class)
public void doSomething() {
// ...
}
@Transactional
上記のコードでは、アノテーションのreadOnly
、timeout
および属性を使用しましたnoRollbackFor
。このメソッドは、タイムアウトが 30 秒の読み取り専用トランザクションとして指定されます。メソッドの実行中に例外が発生した場合IllegalArgumentException
、トランザクションはロールバックされません。
要約する
Spring Boot では、トランザクション管理は非常に重要な概念です。トランザクション アノテーションを使用して、トランザクションの動作を制御できます。トランザクション アノテーションを使用する場合は、トランザクションの伝播動作、トランザクション分離レベル、その他の構成プロパティに注意を払う必要があります。Spring フレームワークは、AOP テクノロジーを使用して、特にプロキシ メカニズムを通じてトランザクション管理を実装します。トランザクション アノテーションを使用する場合、アノテーションが正しく構成されていることを確認する必要があります。構成されていないと、トランザクションがロールバックされないか、ロールバックが不完全になる可能性があります。