当前位置:实例文章 » JAVA Web实例» [文章]Spring事务失效的各种场景

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` 注册

其他信息

其他资源

Top