gpt4 book ai didi

locking - 资源预留模式的锁定和隔离

转载 作者:行者123 更新时间:2023-12-02 02:49:23 25 4
gpt4 key购买 nike

我需要使用 Spring 和 MariaDB 解决资源预留模式。
问题很简单,我有一个客人表,用于存储事件的客人姓名,我必须确保事件的客人数量必须小于或等于最大容量。

这是表:

create table guest(
event int,
name varchar(50)
)
create index event on guest (event);

DB 的正确锁定过程和隔离级别是什么?
请考虑此代码将在多线程容器中运行。
我选择使用“SELECT...FOR UPDATE”锁定表以将锁定限制在一个事件行中。
// START TRANSACTION
@Transactional
public void reserve(int event, String name){
getJdbc().query("SELECT * FROM guest WHERE id=? FOR UPDATE",event);
Integer count=getJdbc().queryForObject("SELECT COUNT(*) FROM guest WHERE id=?",Integer.class,event);
if(count>=MAX_CAPACITY)
throw new ApplicationException("No room left");
getJdbc().query("INSERT INTO guest VALUES (?,?)",event,name);
}
// COMMIT

我做了一些测试,似乎我需要 READ_COMMITTED 隔离级别,对吗?
这是我发现的:
enter image description here

这是我第一次必须更改隔离级别,我对这种需求感到有些惊讶,您能否确认标准 MariaDB 隔离级别 REPETABLE_READ 因这种模式而失败?

最佳答案

问题是,在线程 2 中的事务期间,repeatable_read 保证您看到 DB 处于事务开始时的状态。因此,当时尚未完成的交易 1 的影响将被隐藏。
因此,您将始终看到相同数量的记录,而与同时进行的其他事务无关。所以两个事务都会插入一条记录。

READ_COMMITTED 表示根据文档:“每个一致的读取,即使在同一个事务中,也会设置和读取自己的新快照”。新鲜快照意味着,提交的并发事务的结果将被包括在内。

关于locking - 资源预留模式的锁定和隔离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52923678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com