面试题答案
一键面试数据库隔离级别
- 读未提交(Read Uncommitted):最低的隔离级别,一个事务可以读取另一个未提交事务的数据。这种级别会导致脏读问题,一般不用于高并发且要求数据一致性场景。
- 读已提交(Read Committed):一个事务只能读取已提交事务的数据。可避免脏读,但可能出现不可重复读(同一事务内多次读取同一数据,由于其他事务修改提交,两次读取结果不同)。
- 可重复读(Repeatable Read):在同一个事务内多次读取相同数据,结果始终保持一致,解决了不可重复读问题。在MySQL InnoDB存储引擎下,通过MVCC(多版本并发控制)实现,是默认隔离级别,适合大多数高并发场景。
- 串行化(Serializable):最高隔离级别,事务串行执行,避免了所有并发问题,但性能最低,仅适用于对数据一致性要求极高且并发量极小场景。
在高并发Java应用中,根据业务场景选择合适隔离级别。如读多写少场景且对数据一致性要求较高,可选择可重复读;若对数据一致性要求极为严格,可考虑串行化,但需评估性能影响。
分布式事务解决方案
- XA协议:
- 原理:XA是一种分布式事务协议,由事务管理器(TM)和资源管理器(RM)组成。TM负责协调各个RM的事务,RM负责管理本地资源。XA协议遵循两阶段提交(2PC)。第一阶段,TM向所有RM发送准备指令,RM执行事务操作并记录日志,然后向TM反馈准备结果;第二阶段,若所有RM准备成功,TM向所有RM发送提交指令,RM执行提交操作;若有RM准备失败,TM向所有RM发送回滚指令,RM执行回滚操作。
- 缺点:同步阻塞严重,性能较低,在高并发场景下,等待锁资源时间长,易出现资源死锁。
- Spring集成:Spring通过JtaTransactionManager支持XA事务,配置数据源和事务管理器时指定XA相关属性,如使用Atomikos等实现分布式事务管理。
- TCC模式(Try - Confirm - Cancel):
- 原理:Try阶段,尝试执行业务操作,完成初步检查和资源预留;Confirm阶段,确认执行业务操作,真正提交数据;Cancel阶段,若Try阶段失败,取消之前的操作,释放预留资源。
- 优点:实现灵活,不依赖数据库底层事务机制,适合高并发场景,可根据业务定制补偿逻辑。
- 缺点:业务侵入性强,每个业务操作需实现Try、Confirm、Cancel三个方法,开发成本高。
- Spring集成:可通过引入相关框架(如ByteTCC等)实现TCC模式与Spring集成,在业务代码中按照TCC规范编写相应方法。
Spring提供的相关机制
- 声明式事务管理:通过@Transactional注解,可在方法或类上声明事务属性,如隔离级别、传播行为等。例如:
@Service
public class UserService {
@Autowired
private UserDao userDao;
@Transactional(isolation = Isolation.REPEATABLE_READ, propagation = Propagation.REQUIRED)
public void updateUser(User user) {
userDao.update(user);
}
}
- 事务传播行为:
- REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是最常用的传播行为。
- REQUIRES_NEW:总是创建一个新的事务。如果当前存在事务,则将当前事务挂起,执行完新事务后再恢复当前事务。
- NESTED:如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则创建一个新事务。嵌套事务可以独立于外部事务进行回滚,外部事务回滚时,嵌套事务也会回滚,但嵌套事务回滚不影响外部事务。
- 在高并发应用中,根据业务逻辑选择合适事务传播行为,确保数据一致性。如多个方法调用,部分方法需独立事务处理,可选择REQUIRES_NEW;若需整体保持一致性,可选择REQUIRED。
- 事务同步管理器:Spring提供TransactionSynchronizationManager用于管理事务同步资源,在事务生命周期不同阶段注册回调函数,执行额外逻辑,如在事务提交后清理资源等,确保事务相关操作完整性和一致性。