Spring事务失效的各种场景
发布人:shili8
发布时间:2025-02-01 23:16
阅读次数:0
**Spring 事务失效的各种场景**
在 Spring 框架中,事务机制是用于保证数据库操作的一致性和完整性的。然而,在实际开发过程中,可能会遇到一些情况下事务失效的问题。下面我们将讨论这些场景,并提供相应的代码示例。
### 场景1: @Transactional 注解放在类级别当 `@Transactional` 注解放在类级别时,它只对该类中的方法生效。如果有多个方法需要事务支持,而这些方法不在同一个类中,则需要将 `@Transactional` 注解放在每个方法上。
java//有效的示例@Service@Transactionalpublic class UserService { public void saveUser(User user) { // ... } } // 失效的示例@Servicepublic class UserService { @Transactional public void saveUser(User user) { // ... } public void updateUser(User user) { // ... } }
### 场景2: @Transactional 注解放在方法级别当 `@Transactional` 注解放在方法级别时,它只对该方法生效。如果有多个方法需要事务支持,而这些方法不在同一个类中,则需要将 `@Transactional` 注解放在每个方法上。
java//有效的示例@Servicepublic class UserService { public void saveUser(User user) { // ... } @Transactional public void updateUser(User user) { // ... } } // 失效的示例@Servicepublic class UserService { public void saveUser(User user) { // ... } public void updateUser(User user) { // ... } }
### 场景3: @Transactional 注解放在类级别和方法级别当 `@Transactional` 注解同时放在类级别和方法级别时,它们的行为取决于 Spring 的配置。具体来说,如果 `spring.transaction.default-rollback-on-commit` 属性设置为 `true`,则事务将在每个方法中启动并回滚;如果该属性设置为 `false`,则事务只在类级别启动一次。
java//有效的示例(spring.transaction.default-rollback-on-commit=true) @Service@Transactionalpublic class UserService { public void saveUser(User user) { // ... } @Transactional public void updateUser(User user) { // ... } } // 失效的示例(spring.transaction.default-rollback-on-commit=false) @Service@Transactionalpublic class UserService { public void saveUser(User user) { // ... } @Transactional public void updateUser(User user) { // ... } }
### 场景4: @Transactional 注解放在接口级别当 `@Transactional` 注解放在接口级别时,它只对该接口中的方法生效。如果有多个类实现了该接口,则需要在每个类中将 `@Transactional` 注解放在相应的方法上。
java//有效的示例public interface UserService { void saveUser(User user); @Transactional void updateUser(User user); } // 失效的示例@Servicepublic class UserServiceImpl implements UserService { public void saveUser(User user) { // ... } public void updateUser(User user) { // ... } }
### 场景5: @Transactional 注解放在抽象类级别当 `@Transactional` 注解放在抽象类级别时,它只对该抽象类中的方法生效。如果有多个类继承了该抽象类,则需要在每个类中将 `@Transactional` 注解放在相应的方法上。
java//有效的示例public abstract class UserService { public void saveUser(User user) { // ... } @Transactional public void updateUser(User user) { // ... } } // 失效的示例@Servicepublic class UserServiceImpl extends UserService { public void saveUser(User user) { // ... } public void updateUser(User user) { // ... } }
### 场景6: @Transactional 注解放在枚举级别当 `@Transactional` 注册在枚举级别时,它只对该枚举中的方法生效。如果有多个类使用了该枚举,则需要在每个类中将 `@Transactional` 注册放在相应的方法上。
java//有效的示例public enum UserService { SAVE_USER, UPDATE_USER; @Transactional public void saveUser(User user) { // ... } public void updateUser(User user) { // ... } } // 失效的示例@Servicepublic class UserServiceImpl { public void saveUser(User user) { // ... } public void updateUser(User user) { // ... } }
### 场景7: @Transactional 注册放在父类级别当 `@Transactional` 注册放在父类级别时,它只对该父类中的方法生效。如果有多个子类继承了该父类,则需要在每个子类中将 `@Transactional` 注册放在相应的方法上。
java//有效的示例public class UserService { public void saveUser(User user) { // ... } @Transactional public void updateUser(User user) { // ... } } // 失效的示例@Servicepublic class UserServiceImpl extends UserService { public void saveUser(User user) { // ... } public void updateUser(User user) { // ... } }
### 场景8: @Transactional 注册放在子类级别当 `@Transactional` 注册放在子类级别时,它只对该子类中的方法生效。如果有多个父类继承了该子类,则需要在每个父类中将 `@Transactional` 注册放在相应的方法上。
java//有效的示例public class UserServiceImpl extends UserService { public void saveUser(User user) { // ... } @Transactional public void updateUser(User user) { // ... } } // 失效的示例@Servicepublic class UserService { public void saveUser(User user) { // ... } public void updateUser(User user) { // ... } }
### 场景9: @Transactional 注册放在接口实现级别当 `@Transactional` 注册放在接口实现级别时,它只对该接口实现中的方法生效。如果有多个类实现了该接口,则需要在每个类中将 `@Transactional` 注册放在相应的方法上。
java//有效的示例public interface UserService { void saveUser(User user); @Transactional void updateUser(User user); } // 失效的示例@Servicepublic class UserServiceImpl implements UserService { public void saveUser(User user) { // ... } public void updateUser(User user) { // ... } }
### 场景10: @Transactional 注册放在抽象类实现级别当 `@Transactional` 注册放在抽象类实现级别时,它只对该抽象类实现中的方法生效。如果有多个类继承了该抽象类,则需要在每个类中将 `@Transactional` 注册放在相应的方法上。
java//有效的示例public abstract class UserService { public void saveUser(User user) { // ... } @Transactional public void updateUser(User user) { // ... } } // 失效的示例@Servicepublic class UserServiceImpl extends UserService { public void saveUser(User user) { // ... } public void updateUser(User user) { // ... } }
### 场景11: @Transactional 注册放在枚举实现级别当 `@Transactional` 注册放在枚举实现级别时,它只对该枚举实现中的方法生效。如果有多个类使用了该枚举,则需要在每个类中将 `@Transactional` 注册放在相应的方法上。
java//有效的示例public enum UserService { SAVE_USER, UPDATE_USER; @Transactional public void saveUser(User user) { // ... } public void updateUser(User user) { // ... } } // 失效的示例@Servicepublic class UserServiceImpl implements UserService { public void saveUser(User user) { // ... } public void updateUser(User user) { // ... } }
### 场景12: @Transactional 注册放在父类实现级别当 `@Transactional` 注册放在父类实现级别时,它只对该父类实现中的方法生效。如果有多个子类继承了该父类,则需要在每个子类中将 `@Transactional` 注册