数据库引擎支持

MySQL InnoDB 支持事务,MyISAM 不支持

MySQL 5.5.5 开始默认使用 InnoDB

Bean 没有被Spring管理

  1. // @Service
  2. public class OrderServiceImpl implements OrderService {
  3. @Transactional
  4. public void updateOrder(Order order) {
  5. // update order
  6. }
  7. }

方法不是 Public 的

@Transactional 只作用于 public 方法

自调用问题

因为 @Transactional 实现需要动态代理Bean,自己调用使用的是自己的类,没有用代理类

  1. @Service
  2. public class OrderServiceImpl implements OrderService {
  3. public void update(Order order) {
  4. updateOrder(order);
  5. }
  6. @Transactional
  7. public void updateOrder(Order order) {
  8. // update order
  9. }
  10. }

数据源没有配置事务管理器

  1. @Bean
  2. public PlatformTransactionManager transactionManager(DataSource dataSource) {
  3. return new DataSourceTransactionManager(dataSource);
  4. }

事务传播配置不对

  1. @Service
  2. public class OrderServiceImpl implements OrderService {
  3. @Transactional
  4. public void update(Order order) {
  5. updateOrder(order);
  6. }
  7. @Transactional(propagation = Propagation.NOT_SUPPORTED)
  8. public void updateOrder(Order order) {
  9. // update order
  10. }
  11. }

异常被 catch 了

  1. // @Service
  2. public class OrderServiceImpl implements OrderService {
  3. @Transactional
  4. public void updateOrder(Order order) {
  5. try {
  6. // update order
  7. } catch {
  8. }
  9. }
  10. }

异常类型不对

事务默认回滚的是 RuntimeException,如果需要触发别的需要配置 @Transactional(rollbackFor = Exception.class)

  1. // @Service
  2. public class OrderServiceImpl implements OrderService {
  3. @Transactional
  4. public void updateOrder(Order order) {
  5. try {
  6. // update order
  7. } catch {
  8. throw new Exception("更新错误");
  9. }
  10. }
  11. }