Javaの@Transactionalアノテーションの使い方は何ですか?
Javaでは、@Transactionalは、メソッドがトランザクションの中で実行されることを示す注釈です。これはクラスレベルまたはメソッドレベルに適用することができます。
@Transactionalアノテーションをクラスレベルで使用すると、クラス内のすべてのメソッドにトランザクションが適用されます。これは、クラス内のすべてのメソッドがトランザクションでラップされ、1つのメソッドが他のメソッドを呼び出すと、それらが同じトランザクションで実行されることを意味します。
@Transactional注釈を方法レベルで使用すると、注釈が付けられた方法のみがトランザクション内で実行されます。これにより、特定の方法をトランザクションでラップしたり、他の方法はそうしないように選択することができます。
@Transactionalアノテーションは、トランザクションの振る舞いを定義するために異なる属性を使用できます。例えば、伝播動作、分離レベル、タイムアウトなどがあります。一般的に使用される属性のいくつかは次の通りです:
- 伝播:トランザクションの伝播動作を定義し、メソッド呼び出しチェーン内でのトランザクションの扱い方を示します。例えば、REQUIRES_NEWは毎回の呼び出しで新しいトランザクションが作成されることを示します。
- 隔離:事務隔離指定如何處理並發事務。常用的隔離級別有READ_COMMITTED和SERIALIZABLE。
- タイムアウト:トランザクションのタイムアウト時間を定義します。つまり、トランザクションが投稿されない場合、どれくらいの時間が経過した後に自動ロールバックするかを指定します。
- readOnly:トランザクションが読み取り専用かどうかを指定します。トランザクションが読み取りのみの操作である場合、パフォーマンスを向上させるためにtrueに設定することができます。
@Transactionalアノテーションを使用した例を以下に示す:
@Service
@Transactional
public class ProductService {
@Autowired
private ProductRepository productRepository;
public void createProduct(Product product) {
productRepository.save(product);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void updateProduct(Product product) {
productRepository.save(product);
}
@Transactional(readOnly = true)
public Product getProductById(Long id) {
return productRepository.findById(id).orElse(null);
}
}
上記の例では、createProductメソッドとgetProductByIdメソッドは同じトランザクションで実行されます。updateProductメソッドは新しいトランザクションで実行されますが、createProductメソッドから呼び出されていても同じです。