先上结论:
隔离级别最好使用
READ_COMMITTED,读已提交。
如果@Transaction注解,不设置isolation隔离级别,使用默认的级别,可能会有脏读的可能。
@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
具体业务遇到的问题。
预约订单的时候,先根据任务ID跟关键词ID,以及订单状态是未预约等状态去数据库中查询可预约的订单。,获取到不为null,才继续执行逻辑。这里由于前端点击预约订单的时候,点击太快,连续调用了预约订单的接口。当第一次调用的时候,在第一个线程中调用逻辑,获取订单后,改变订单的预约状态,即改变为已预约的状态,最后提交事务,释放锁,然后多点的预约订单的线程运行的时候,一样去数据库查询符合预约条件的订单,这个时候,虽然上一个线程已经提交了事务,在navicat中查询也能正常查询到第一个线程提交的订单的状态。但是如果这里@Transaction注解的隔离级别使用的是默认的,第二个线程就会产生脏读,导致第二个线程去预约订单的时候,查询的可预约的订单就会包含上一个线程已经预约提交了的订单。所以,最好就是将隔离级别改为读已提交。