mysql - 了解 Spring 中的事务和数据库级别的事务吗?

标签 mysql database concurrency transactions spring-transactions

尝试了解数据库事务是如何在 Spring 和数据库中实现的。我一直在编写大量查询并使用 @Transactional,但从未真正尝试考虑数据库级别上发生的情况。

所以,我开始浏览here , herehere .

假设我们有这段代码:

@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。但是,如果出现如图所示的以下情况,这将如何发挥作用?

enter image description here

让我们想象一下,我们有一个简单且单一的航类来填补座位。假设有50个座位。预订遵循先到先得的原则。通过在简单的 seats 表中插入新行来进行预订。

可以在图像上看到表格。

这种情况可能吗?我知道在数据库级别上一切都发生得很快,但假设左侧事务 (T1) 由于某种原因比右侧事务 (T2) 慢。由于我们处于 REPEATABLE_READ 隔离级别,因此不会发生 DIRTY_READ、NON_REPEATABLE_READS 和 PHATOM_READS(作为并发问题)。

附注如果有关于该主题的好书或 Udemy 类(class)的推荐,我们将不胜感激。不过我是个初学者。

最佳答案

START TRANSACTION;
SELECT ... FOR UPDATE;
...
UPDATE ...;
COMMIT;

请注意用于更新。它增加了额外的锁定,以防止出现您所描述的问题。

(我认为 transaction_isolation_mode 对于您的示例并不重要。)

关于mysql - 了解 Spring 中的事务和数据库级别的事务吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73198996/

相关文章:

php - 尽管锁定表,并发请求仍将失败

mysql - 临时表(Memory Engine)和大物理表(1.7GB myisam)的join优化

multithreading - 戈朗 : can WaitGroup leak with go-routines

go - 如何使用 channel 对 golang 管道阶段中的项目进行批处理?

c# - 使用 firebird RDBMS 在 .NET 应用程序中自动刷新数据

java - java 线程的基准测试

php - 如何从 MYSQL 中的 COUNT(*) ORDER BY 语句打印数组的内容

mysql - 我如何在 typo3 存储库方法中实现日期转换

mysql - 在mac上安装mysql2时出现"Failed to build gem native extension"错误

android - 单元测试中的 Sugar orm 产生了空指针异常