1、數據庫引擎不支持事務
2、沒有被 Spring 管理
如下面例子所示:
// @Service
public class OrderServiceImpl implements OrderService {
@Transactional
public void updateOrder(Order order) {
// update order
}
}
如果此時把 @Service 註解註釋掉,這個類就不會被加載成一個 Bean,那這個類就不會被 Spring 管理了,事務自然就失效了。
3、方法不是 public 的
4、自身調用問題
@Service
public class OrderServiceImpl implements OrderService {
public void update(Order order) {
updateOrder(order);
}
@Transactional
public void updateOrder(Order order) {
// update order
}
}
update方法上面沒有加 @Transactional 註解,調用有 @Transactional 註解的 updateOrder 方法,updateOrder 方法上的事務管用嗎?
5、數據源沒有配置事務管理器
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
6、不支持事務
來看下面這個例子:
@Service
public class OrderServiceImpl implements OrderService {
@Transactional
public void update(Order order) {
updateOrder(order);
}
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void updateOrder(Order order) {
// update order
}
}
7、異常被吃了
這個也是出現比較多的場景:
// @Service
public class OrderServiceImpl implements OrderService {
@Transactional
public void updateOrder(Order order) {
try {
// update order
} catch {
}
}
}
8、異常類型錯誤
上面的例子再拋出一個異常:
// @Service
public class OrderServiceImpl implements OrderService {
@Transactional
public void updateOrder(Order order) {
try {
// update order
} catch {
throw new Exception("更新錯誤");
}
}
}
這樣事務也是不生效的,因爲默認回滾的是:RuntimeException,如果你想觸發其他異常的回滾,需要在註解上配置一下,如: