一、异常被吃了
把异常吃了,然后又不抛出来,事务不会回滚。
@Service
public class OrderServiceImpl implements OrderService {
@Transactional
public void updateOrder(Order order) {
try {
// update order
} catch {
}
}
}
二、异常类型错误
@Service
public class OrderServiceImpl implements OrderService {
@Transactional
public void updateOrder(Order order) {
try {
// update order
} catch {
throw new Exception("更新错误");
}
}
}
这样事务也是不生效的,因为默认回滚的是:RuntimeException,如果你想触发其他异常的回滚,需要在注解上配置一下,如:
@Transactional(rollbackFor = Exception.class)
三、方法不是public的
@Transactional只能用于public的方法上,否则事务不会失效,如果要用在非public方法上,可以开启AspectJ代理模式。
四、数据库引擎不支持事务
MyISAM引擎是不支持事务操作,InnoDB才是支持事务的引擎。
五、没有被Spring管理
没写@Service、@Component等注解
六、自身调用问题
update方法上面没有加@Transactional注解,调用有@Transactional注解的updateOrder方法,事务失效。需要在update方法上加@Transactional注解,updateOrder方法可以不用加。
@Service
public class OrderServiceImpl implements OrderService {
@Transactional
public void update(Order order) {
updateOrder(order);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void updateOrder(Order order) {
// update order
}
}
七、数据源没有配置事务管理器
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
八、不支持事务
@Transactional(propagation = Propagation.NOT_SUPPORTED)
网友评论