Spring事務不生效的場景分析

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,如果你想觸發其他異常的回滾,需要在註解上配置一下,如:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章