gpt4 book ai didi

SQL 基本并发

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

INSERT INTO T1 (xField) SELECT 7 AS xField WHERE (SELECT COUNT(*) FROM T1) = 0

基本上,如果有 100 万用户同时运行此程序,那么 T1 中最终会不会超过一行?
Thread A: SELECT COUNT(*) FROM T1: 0
Thread B: SELECT COUNT(*) FROM T1: 0
Thread A: INSERT INTO T1...
Thread B: INSERT INTO T1...

还是保证永远不会发生,因为这只是一个声明?

如果那不安全,那么像这样的事情怎么办?

表 T2(GoNorth 和 GoSouth 不得同时为 1):
ID      GoNorth   GoSouth
1 0 0

然后发生这种情况:
User A: UPDATE T2 SET GoNorth = 1 WHERE GoSouth = 0
User B: UPDATE T2 SET GoSouth = 1 WHERE GoNorth = 0

Thread A: Find rows where GoSouth = 0
Thread B: Find rows where GoNorth = 0
Thread A: Found a row where GoSouth = 0
Thread B: Found a row where GoNorth = 0
Thread A: Setting GoNorth = 1 for the located row
Thread B: Setting GoSouth = 1 for the located row

结果:
ID      GoNorth   GoSouth
1 1 1

什么可以同时发生,什么不能同时发生,规则是什么?

我的数据库引擎是“Microsoft SQL Server 2008 R2 (SP2)”。

最佳答案

不。它是作为单个语句编写的,因此 SQL 规则规定整个语句是原子的。

但是,这里有一些注意事项。首先,这可能意味着创建相当多的锁,以致您的表在查询完成之前变得有效不可用。换句话说,为了保证安全,你会丢弃并发。另一个警告是,这仅适用于默认隔离级别。较弱的隔离级别可能允许查询在不创建适当锁的情况下运行。一个非常弱的隔离级别可能允许它忽略锁。

关于SQL 基本并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16441451/

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