@Transactional 注解控制事務(wù)有哪些不生效的場景:
- 數(shù)據(jù)庫引擎不支持實物
- 數(shù)據(jù)源沒有配置事務(wù)
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
- 沒有被Spring管理:service注解被注掉了
// @Service
public class OrderServiceImpl implements OrderService {
@Transactional
public void updateOrder(Order order) {
// update order
}
}
- 方法本身不是public的
- 方法自身調(diào)用有問題
默認只有在外部調(diào)用時候才生效鞍时,自身調(diào)用沒有用
@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
}
}
- 不支持事務(wù)
- 被異常吃了:被異常catch住了荣茫,又沒有扔出來
// @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("更新錯誤");
}
}
}
這樣事務(wù)也是不生效的,因為默認回滾的是:RuntimeException,如果你想觸發(fā)其他異常的回滾,需要在注解上配置一下,如:
@Transactional(rollbackFor = Exception.class)
這個配置僅限于 Throwable 異常類及其子類。