Springのトランザクション制御
Springフレームワークにおけるトランザクション制御は、二通りの方法によって実現されています。
- アノテーションベースのトランザクション制御
- トランザクション制御が必要なメソッドに @Transactional を付ける。
- @Transactionalアノテーションは、トランザクションの伝播動作、隔離レベル、読み取り専用かなどのトランザクションの属性を指定して、メソッドレベルやクラスレベルで使用できます。
- プログラム的トランザクション制御に基づいて:
- TransactionTemplate クラスを使用してトランザクションを手動的に開始、コミット、またはロールバックします。
- TransactionCallbackインターフェースを実装したクラスからdoInTransactionメソッドを実行することで、トランザクション処理を行う。
下記は、Springでトランザクション制御を行う方法の例です。
@Service
public class UserService {
@Autowired
private UserDao userDao;
@Transactional
public void createUser(User user) {
// 在方法上添加@Transactional注解,表示该方法需要事务控制
userDao.createUser(user);
}
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
public void updateUser(User user) {
// 使用@Transactional注解的属性,指定事务的传播行为和隔离级别
userDao.updateUser(user);
}
}
@Repository
public class UserDao {
@Autowired
private JdbcTemplate jdbcTemplate;
public void createUser(User user) {
// 执行数据库插入操作
String sql = "INSERT INTO user (id, name) VALUES (?, ?)";
jdbcTemplate.update(sql, user.getId(), user.getName());
}
public void updateUser(User user) {
// 执行数据库更新操作
String sql = "UPDATE user SET name = ? WHERE id = ?";
jdbcTemplate.update(sql, user.getName(), user.getId());
}
}
上記の例では、UserServiceクラスのcreateUserとupdateUserメソッドはトランザクション制御が必要になります。@Transactionalアノテーションをメソッドに追加すると、2つのメソッドがトランザクション管理が必要になります。UserDaoクラスでは、SpringのJdbcTemplateを使用してデータベース操作を実行します。これらの操作は、自動的にトランザクションに参加します。
トランザクション制御にSpringを使用する場合は、トランザクションマネージャー(DataSourceTransactionManagerなど)が設定されている必要があります。また、設定ファイルでトランザクション制御のサポートを有効にする必要があります。たとえば、Spring Bootでは、application.propertiesまたはapplication.ymlファイルでspring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate5.SpringSessionContextを設定します。