gpt4 book ai didi

isolation-level - 我应该使用哪个隔离级别来预订航类

转载 作者:行者123 更新时间:2023-12-05 00:35:08 27 4
gpt4 key购买 nike

我有一个使用 mssql 的航类预订程序
,对于预订航类,我想确定我应该使用隔离级别还是锁?

(这是一个示例代码,我的问题是这种情况的隔离级别不做保留)

我的数据库有一个库存表,如:

Inventory Table
------------------------
id (Pk),
FlightNumber,
Total,
Sold

现在如果有人想预订航类,我在交易中使用此代码
Decalre @total int;
Decalre @sold int;
Select @total=Total,@sold=Sold From Inventory where FlightNumber='F3241b';

IF @total-@sold > 0
BEGIN
Update inventory set Sold=Sold+1 where FlightNumber='F3241b';
PRINT 'Reserve Complete'
END
ELSE
PRINT 'this flight is full'

我有这些问题:

Q1:我应该使用锁还是隔离级别?使用一个对性能有什么好处吗?

Q2:根据 Q1 我应该使用哪种隔离级别或锁定

最佳答案

如果您想查看哪种隔离级别将使示例代码按原样工作,而不是解决示例代码所解决问题的最佳方法,那么您将需要至少可重复读取的保证。

对并发使用严格的两阶段锁定 (S2PL) 的数据库允许 READ COMMITTED 事务在每个语句完成时甚至更早时删除共享锁,因此在事务 A 检查可用性和它要求席位的时间之间,其他人可以通过事务 B 并再次读取,而不会导致任一事务失败。交易 A 可能会暂时阻止交易 B,但两者都会更新,您可能会被超卖。

在使用多版本并发控制 (MVCC) 进行并发的数据库中,读取不会阻止写入,写入不会阻止读取。在 READ COMMITTED 中,每条语句都根据已提交的内容使用数据库的新快照,并且至少在某些情况下(我知道在 PostgreSQL 中是这样),并发写入可以无误地解决。因此,即使事务 A 正在更新已售数量,或者已这样做但未提交,事务 B 也会看到旧计数并继续更新。当它尝试更新时,它可以阻止等待先前的更新,但是一旦提交,它会找到该行的新版本,检查它是否符合选择标准,如果符合则更新,如果不符合则忽略该行,以及继续提交而不会出错。所以,再一次,你被超卖了。

如果您选择使用事务隔离,我想这会回答 Q2。通过修改示例代码以获取显式锁,可以在较低的隔离级别解决该问题,但这通常会导致更多的阻塞,而使用足够严格的隔离级别可以自动处理它。

关于isolation-level - 我应该使用哪个隔离级别来预订航类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9736962/

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