试图理解数据库事务是如何在Spring和数据库中实现的.我一直在编写很多查询,并使用了@Transactional
个查询,但我从未真正try 过考虑数据库级别上发生的事情.
假设我们有这段代码:
@Service
public class ReservationService {
private static final int SEAT_LIMIT = 50;
private SeatsRepository seatsRepository;
@Transactional
public String reservate(User user){
int currentSeatsReservations = seatsRepository.getCurrentSeatsReservations();
if (SEAT_LIMIT - currentSeatsReservations >= 1){
//make new seat reservation
seatsRepository.addNewSeatReservation(System.currentTimeMillis(), user.getId());
return "Congrats! You just made your reservation";
}
return "All seats are already booked";
}
@Repository
interface SeatsRepository{
@Query(value = "SELECT COUNT(id) as CURRENT_TOTAL_SEATS_TAKEN FROM seats;", nativeQuery = true)
int getCurrentSeatsReservations();
@Query(value = "INSERT INTO seats(timestamp, user_id) VALUES (:timestamp, :userId);", nativeQuery = true)
void addNewSeatReservation(long timestamp, int userId);
}
}
我确实知道MySQL的默认隔离是REPEATABLE_READ.但这将如何配合下面的情况,就像在图像中一样?
让我们想象一下,我们有一个简单的单程航班要填满座位.我们说50个座位吧.订座实行先到先得的原则.通过在一个简单的seats
表中插入新行来进行预订.
图中可以看到这张桌子.
这种情况有可能出现吗?我知道在数据库级别上一切都发生得很快,但是假设左边的事务(T1)由于某种原因比右边的事务(T2)慢.由于我们处于REPEATABLE_READ隔离级别,因此不会发生DIRESS_READ、NON_REPEATABLE_READS和PHATOM_READS(作为并发问题).
另外,任何关于这一主题的好书或Udemy课程的推荐都将不胜感激.不过,我还是个初学者.