AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题

问题[concurrency](dba)

Martin Hope
GenGG
Asked: 2022-08-11 18:10:54 +0800 CST

Hash之间的并发控制B-Tree

  • 1

我是交易新手。当我阅读“事务信息系统”一书时,提到 B-tree 使用键范围锁定来保证可串行化。这是真的所有对关系的访问都必须通过相同的 B-tree 进行以保证可序列化吗?

如果我理解正确,如果访问是通过不同的索引,则无法保证可序列化。请参阅以下示例。

假设同一个关系上有两个索引,分别是B树和哈希索引,并且有两个事务。

首先,一个事务使用散列索引读取关系,例如,fetchkey(16)使用键获取(当前不存在的)记录16并且找不到匹配项。由于散列没有键范围锁定,它不能锁定下一个键。然后,另一个事务通过 B-tree 插入一条键为 '16' 的记录。插入将成功,导致幻像。

transaction concurrency
  • 2 个回答
  • 28 Views
Martin Hope
Martin Thoma
Asked: 2022-08-08 21:44:41 +0800 CST

序列化异常是否只有 SUM/COUNT 才有可能?

  • 2

我已阅读深入了解 MySQL 和 PostgreSQL 中的隔离级别和阅读现象,尤其是“Postgres 中的序列化异常”部分。我想我已经理解了那里描述的问题,但是我很难判断它何时会在我的应用程序中发生。

是否只有使用 SUM/COUNT 等聚合函数才能在 Postgres 中获得序列化异常?如果不是,我还需要注意什么?

postgresql concurrency
  • 1 个回答
  • 132 Views
Martin Hope
Iliana Kollia
Asked: 2022-04-23 09:22:01 +0800 CST

MySQL 并发更新

  • 2

假设我们在使用 MySQL的应用程序中有以下情况,其中用户可以购买商品,并且每个商品都有一个买家,但商品的价格可能会发生变化。

伪代码:

BEGIN TRANSACTION

seenPrice = SELECT price FROM Item
    WHERE id = ABC AND buyer IS NULL

UPDATE Item SET buyer = X
    WHERE id = ABC AND buyer IS NULL AND price = seenPrice

COMMIT

UPDATE 语句中的seenPrice变量和buyer IS NULL AND price = seenPrice检查用作乐观锁,以确保不会出现任何并发问题。

在多线程环境中,线程 A 和线程 B 同时通过SELECT语句并说线程 A 先执行UPDATE语句,然后并发性不是问题,但 A 和 B 是否有可能同时执行UPDATE语句相同的确切时间?对于上下文,正在使用 Spring Boot 和 Spring Data JPA 开发应用程序。

mysql concurrency
  • 3 个回答
  • 362 Views
Martin Hope
Jonathan Wood
Asked: 2022-02-01 10:01:04 +0800 CST

获取下一个发票编号和增量,而不会出现并发问题

  • -1

我有一个位置表,看起来像这样:

CREATE TABLE Locations (
    Id INT NOT NULL AUTO_INCREMENT,
    Name VARCHAR(255) NOT NULL,
    NextInvoice INT NOT NULL,
    PRIMARY KEY (Id)
);

现在我想为一个位置创建一张发票,我需要一个发票号。

发票编号将等于NextInvoice该位置的值。然后我必须为下一张发票增加这个值。

非常简单的逻辑,但由于并发和竞争条件而变得复杂。

我如何执行检索某个位置的下一个可用发票编号然后递增该值的任务,并且在同时多次调用该代码时不重复或跳过任何数字?

我不能使用自动递增的唯一约束数,因为数字可以跨位置重复。

注意:我的核心技能包括 C#,不一定是 SQL-Server。事实上,我正在为此使用实体框架。但如果需要,我不会写一个存储过程。

sql-server concurrency
  • 1 个回答
  • 608 Views
Martin Hope
Yves
Asked: 2021-09-15 07:32:09 +0800 CST

处理多线程插入的正确方法是什么

  • 0

我是数据库的新手,现在我需要使用 MySQL 来构建 Web 服务器。

总之,我有一个用 Python 开发的 web 框架。它将从/向 MySQL 读取/写入数据。

现在我不知道如何处理 multithreading 的情况insert。

假设有很多用户正在将他们的数据写入一张表中。我会使用一个线程池来处理这些请求,也就是说同时会有多个inserts。

我的问题是:

如果我已经设置了concurrent_insert=2,multiple insert-s 是否仍然会导致 table 的锁定,这样我会得到一个非常糟糕的性能(所有的inserts 都必须一个一个处理)?或者 MySQL 本身可以insert正确处理倍数,因此我可以获得不错的性能?

对于倍数,“共享一个连接对象”和“每个都有自己的连接对象”insert有什么区别吗?insert

mysql concurrency
  • 2 个回答
  • 644 Views
Martin Hope
Alex Shelemin
Asked: 2021-02-16 01:33:23 +0800 CST

已提交读隔离下的缺失行

  • 7

众所周知,Read Committed 隔离容易出现不同的异常。我阅读了 The Great Paul White 关于隔离级别的系列文章。与讨论相关的帖子是这个:

  • 已提交读隔离级别

它声明(再次,这是众所周知的),在读取提交隔离下运行的语句:

Can encounter the same row multiple times;
Can miss some rows completely;

我的问题是关于“缺失的行”部分。讨论丢失行的示例通常使用以下查询来说明问题:

select count(*) from table.

我的问题是“常规”选择查询中的行是否会丢失?意思是,查询可以像

select * from table

甚至

select * from table where id = @id

还会错过在该查询开始之前提交的行吗?此问题仅适用于使用锁定(不是 RCSI)提交的读取,因为 RCSI 不允许这些类型的异常。

sql-server concurrency
  • 1 个回答
  • 343 Views
Martin Hope
ClassNotFoundException
Asked: 2021-01-26 01:20:31 +0800 CST

数组的并发更新(Postgres)

  • 0

我有一个可以从多个工作人员更新的数组,如下所示 UPDATE my_table SET arr = array_append(my_table.arr, element):

当两个工作人员尝试同时更新数组时,就会出现问题。例如,两个工人都看到在更新的那一刻,数组是空的,并尝试如下追加一个元素: array_append(empty_arr, element_a)和array_append(empty_arr, element_b)。最后,数组的最终内容将是:arr[element_a]或者arr[element_b]因为其中一个工作人员将更早完成对数组的更新,并且它的值将被另一个工作人员的值覆盖。如何确保两个值都写入数组:arr[element_a, element_b]?

postgresql concurrency
  • 1 个回答
  • 144 Views
Martin Hope
Léo Vital
Asked: 2020-11-10 10:42:12 +0800 CST

验证多对多关系不会超过某个限制的正确方法是什么?

  • 1

在 Postgres 数据库中,我的关系如下:

  1. Group 表有一个列 userEntranceLimits。
  2. UserEntrance 表有一个列 userId 和一个列 groupId。
  3. 特定组的 UserEntrance 的不同用户的计数不得超过组的 userEntranceLimits。
  4. 在用于创建新 UserEntrance 的事务(其隔离级别为 REPEATABLE_READ)内部,我检查该组的当前 UserEntrance 计数是否 >= 限制。
  5. 如果不是,我继续创建一个新的 UserEntrance。
  6. 在极少数情况下,组出现的 UserEntrance 数超过其限制。

我理解为什么存在这种竞争条件,但我不明白在不使用 SERIALIZABLE 隔离级别的情况下防止它发生的正确方法。我们在这张表上有很多并发写入,当我们之前尝试使事务 SERIALIZABLE 时,它并不顺利。

我现在的想法是做一个SELECT ... FOR UPDATE并计算应用程序端的出现次数,但这对我来说似乎是一个糟糕的解决方案。这种问题的正确解决方案是什么?

postgresql concurrency
  • 1 个回答
  • 105 Views
Martin Hope
Paul Draper
Asked: 2020-10-22 17:41:23 +0800 CST

PostgreSQL更新与删除+插入有什么“特别”

  • 12

我的理解是更新锁定一个元组,将其标记为已删除,然后添加一个新元组。

换句话说,更新 = 删除 + 插入。

至少我是这么相信的。但它似乎与 MVCC 中的 delete+insert 的更新有根本的不同。


设置:

CREATE TABLE example (a int PRIMARY KEY, b int);
INSERT INTO example VALUES (1, 1);

方法一:更新

-- session A                          session B
BEGIN;
UPDATE example SET b = 2 WHERE a = 1;
                                      DELETE FROM example WHERE a = 1;
COMMIT;
-- now there are 0 rows in table example (1 row was deleted by session B)

方法二:删除插入

-- session A                          session B
BEGIN;
DELETE FROM example WHERE a = 1;
INSERT INTO example VALUES (1, 2);
                                      DELETE FROM example WHERE a = 1;
COMMIT;
-- now there is 1 row in table example (0 rows deleted by session B)

因此

UPDATE example SET b = 2 WHERE a = 1;

不同于

DELETE FROM example WHERE a = 1;
INSERT INTO example VALUES (1, 2);

我如何理解更新的 MVCC 本质?元组是否具有在更新期间保留的某种 MVCC“身份”?它是什么?

postgresql concurrency
  • 1 个回答
  • 2958 Views
Martin Hope
user183966
Asked: 2020-07-04 07:32:55 +0800 CST

如何防止在 postgres 的当前连接期间从 bytea 隐式转换为文本?

  • 1

在 Postgres中,值在插入到/列时会根据设置bytea自动转换为。texttextvarcharbytea_output

我正在使用一些程序代码,它会自动将程序中的某些值(二进制字符串)转换为 bytea 格式。问题是用户可能不小心尝试将这些值插入到text列中。默认情况下,Postgres 将允许这样做,但这并不总是能顺利进行 - 例如,如果有非 ASCII 字节。我认为用户可能没有意识到奇怪的插入行为是由于他们在调用程序中使用了二进制字符串。因此,如果bytea发生text转换,我希望 Posgres 引发异常。

我知道CREATE CAST,但据我所知,这是一个系统范围的操作。我不想更改其他连接的系统行为。我可以这样做CREATE CAST,DROP CAST但这对我来说似乎很脏,因为它仍然不包含在连接中。

如何进行(隐式)强制转换bytea以text仅在当前连接中引发异常?

sql是自动发出的,所以我可以在每条语句之前添加一个前面的sql语句,没问题。

我对这种行为有点惊讶,因为 Postgres 通常会在严格方面犯错,这是我喜欢的。

这个问题来自我之前的问题:

  • 如何防止不同的连接对同一查询中的 bytea 进行不同的处理?
postgresql concurrency
  • 1 个回答
  • 3003 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve