1 在主启动类上添加@EnableTransactionManagement注解开启事务支持
@SpringBootApplication
@EnableTransactionManagement
public class SpringbootTest01Application {
public static void main(String[] args) {
SpringApplication.run(SpringbootTest01Application.class, args);
}
}
2 在需要开启事务的方法或类上添加@Transactional注解
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
UserMapper userMapper;
@Override
public int insert(User user) {
DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
definition.setName("testTx");
definition.setPropagationBehavior(DefaultTransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus status = transactionManager.getTransaction(definition);
int result = -1;
try {
result = userMapper.insert(user);
}catch (Exception e){
transactionManager.rollback(status);
e.printStackTrace();
}finally {
return result;
}
}
}
在@Transactional注解中有几个可选的参数
- propagation:事务的传播级别
- REQUIRED:默认值,如果当前存在事务则使用当前事务,如果没有则创建一个事务
- REQUIRES_NEW:创建一个事务,如果当前存在事务则把旧事务挂起
- SUPPORTS:如果当前存在事务则使用当前事务,如果没有则以非事务的方式运行
- NOT_SUPPORTED:以非事务的方式运行,如果当前存在事务则把旧事务挂起
- NEVER:以非事务的方式运行,如果当前存在事务则抛出异常
- MANDATORY:如果当前存在事务则使用当前事务;如果当前没有事务则抛出异常
- NESTED:如果当前存在事务则创建一个事务嵌套进原来的事务,如果没有则创建一个事务
- isolation:事务的隔离级别
- READ_UNCOMMITTED:读未提交,可能导致脏读
- READ_COMMITTED:读已提交,可能导致不可重复读
- REPEATABLE_READ:重复读,可能导致幻读
- SERIALIZABLE:序列化,使所有事务串行执行
- rollbackFor:触发回滚的异常类型,默认为RuntimeException