我来为您详细讲解Spring中@Transactional用法的攻略。
Spring中@Transactional用法详细介绍
一、什么是@Transactional
@EnableTransactionManagement注解:开启事务管理器。
@Transactional注解:在类或方法上标记该业务需要事务管理。
二、@Transactional的常用属性
1. propagation属性
事务传播行为:定义业务方法间的事务关系。
- REQUIRED:默认值,外围方法创建了事务,则当前方法就在这个事务中共同协作。如果外围方法没有创建事务,则当前方法就自己创建一个新的事务。
- SUPPORTS:外围方法创建了事务,则共同协作;否则当前方法就以非事务的方式运行。
- REQUIRES_NEW:当前方法必须启动一个新的事务,并在自己的事务完成之后,将原有事务恢复继续执行。
- NOT_SUPPORTED:当前方法不应该在外围方法的事务上执行。如果当前方法在外围方法的上下文中已经有了事务,那么不支持执行,要么当前方法取消事务运行,要么外围方法将事务结束。
- MANDATORY:外围方法必须存在事务,否则会发生异常。
- NEVER:当前方法不应该在外围方法的事务上执行。如果当前方法在外围方法的上下文中已经有了事务,则抛出异常。
- NESTED:当前方法在外围方法的事务中以一个嵌套事务的形式运行。
2. isolation属性
事务隔离级别:定义事务可能遇到的问题类型。
- DEFAULT:默认值,使用默认隔离级别。
- READ_UNCOMMITTED:不允许脏读,允许dirty read。
- READ_COMMITTED:允许不可重复读,不允许脏读。
- REPEATABLE_READ:如果你在事务范围内读取过某一条记录,你再次读取时的结果,应该与之前读取时的结果一致。
- SERIALIZABLE:最严格的隔离级别,通过强制事务排序来避免典型的并发问题。
3. timeout属性
事务超时时限:定义事务强制回滚之前,可以占用多长时间。
4. readOnly属性
是否是只读事务:只读事务可以带来更高的性能。
5. rollbackFor属性
当遇到异常时,需要回滚的异常类型。例:
@Transactional(rollbackFor = {RuntimeException.class})
6. noRollbackFor属性
当遇到异常时,不需要回滚的异常类型。
@Transactional(noRollbackFor = {NullPointerException.class})
三、示例
示例1:基本使用
@Service
@Transactional
public class UserService {
@Autowired
private UserDao userDao;
@Override
public void saveUser(User user) {
userDao.saveUser(user);
}
}
示例2:使用多个数据源
@Service
@Transactional(transactionManager = "transactionManager1")
public class UserService {
@Autowired
private UserDao userDao1;
@Transactional(transactionManager = "transactionManager2")
public void saveUser(User user) {
userDao2.saveUser(user);
}
}
以上就是Spring中@Transactional用法的详细介绍。希望能对您有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring中@Transactional用法详细介绍 - Python技术站