面试题答案
一键面试1. Java注解与事务传播行为、事务隔离级别结合
- 事务传播行为:在Hibernate中,
@Transactional
注解用于事务管理。事务传播行为定义了一个事务方法被另一个事务方法调用时的行为。例如,Propagation.REQUIRED
(默认值)表示如果当前存在事务,就加入该事务;如果不存在,则创建一个新事务。Propagation.SUPPORTS
表示如果当前存在事务,就加入该事务;如果不存在,就以非事务方式执行。在代码中可如下使用:
@Service
public class SomeService {
@Autowired
private AnotherService anotherService;
@Transactional(propagation = Propagation.REQUIRED)
public void methodWithTransaction() {
// 业务逻辑
anotherService.doSomething();
}
}
@Service
public class AnotherService {
@Transactional(propagation = Propagation.SUPPORTS)
public void doSomething() {
// 业务逻辑
}
}
- 事务隔离级别:事务隔离级别定义了一个事务与其他事务之间的隔离程度。
@Transactional
注解也可以设置事务隔离级别。例如,Isolation.READ_COMMITTED
表示一个事务只能读取已经提交的事务所做的修改。代码示例如下:
@Service
public class TransactionService {
@Transactional(isolation = Isolation.READ_COMMITTED)
public void transactionalMethod() {
// 业务逻辑
}
}
2. 多数据库操作的事务处理与异常回滚
- 确保事务正确处理:当开发涉及多个数据库操作的业务逻辑时,可在包含这些操作的方法上添加
@Transactional
注解。假设我们有一个用户注册服务,需要在用户表和用户详情表插入数据:
@Service
public class UserRegistrationService {
@Autowired
private UserRepository userRepository;
@Autowired
private UserDetailsRepository userDetailsRepository;
@Transactional
public void registerUser(User user, UserDetails userDetails) {
userRepository.save(user);
userDetailsRepository.save(userDetails);
}
}
- 异常情况下的回滚机制:默认情况下,
@Transactional
注解会在发生未检查异常(如RuntimeException
及其子类)时自动回滚事务。如果需要在检查异常(如SQLException
)时也回滚事务,可以在@Transactional
注解中指定rollbackFor
属性。例如:
@Service
public class UserRegistrationService {
@Autowired
private UserRepository userRepository;
@Autowired
private UserDetailsRepository userDetailsRepository;
@Transactional(rollbackFor = {SQLException.class})
public void registerUser(User user, UserDetails userDetails) throws SQLException {
userRepository.save(user);
userDetailsRepository.save(userDetails);
}
}
这样,当registerUser
方法内任何数据库操作抛出SQLException
时,事务都会回滚,确保数据的一致性。