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 / 问题

问题[isolation-level](dba)

Martin Hope
Fajela Tajkiya
Asked: 2022-08-22 05:04:44 +0800 CST

了解 SQL Server 版本存储

  • 4

我正在尝试了解 SQL Server 版本存储和相关的隔离级别。据我了解,当数据库启用读取提交快照选项时,可能会发生这种情况:

  • 一个项目 (id = 1) 在数据库中的价格为 $1000
  • 会话 1 启动更新语句:update products set price = price * 1.5. 由于这涉及表格的所有行,因此需要很长时间。
  • 当update语句仍在进行中时,会话 2 开始查询:select * from products where id = 1。由于数据库处于读取提交快照模式,因此写入者不会阻塞读取者。所以会话 1 从版本商店读取了该行的旧版本,并认为该产品的价格为 1000 美元。
  • session 1的用户觉得价格还不错,所以决定买。但 ...
  • 在用户将产品添加到他的购物车之前,上述update语句执行完毕,产品 (id = 1) 的新价格为 1500 美元。如果用户知道产品的新价格,他就不会购买。

在这种情况下,会发生什么?这种情况真的可能吗?如果是这样,防止这种情况的规范是什么?

sql-server isolation-level
  • 2 个回答
  • 413 Views
Martin Hope
Nikita Glukhov
Asked: 2021-06-04 13:13:43 +0800 CST

PostgreSQL 如何处理不同事务隔离级别的并行事务?

  • 3

我有一个典型的 Java Spring + Postgres 环境(该项目是遗留项目)。后端的持久层混合了声明的隔离级别——其中一些是默认的,即 READ COMMITED,另一些是 REPEATABLE READ,还有一些是 SERIALIZABLE。

有时,从具有不同隔离级别的并行事务访问相同的数据库表。

此类交易的交互是否有一些严格的规则?

我或多或少可以理解这种情况,当所有事务具有相同的隔离级别并且其中一些事务声明显式锁以细粒度避免不良读取现象时,但不是上述情况。

postgresql isolation-level
  • 1 个回答
  • 576 Views
Martin Hope
Hovin
Asked: 2021-05-21 18:40:04 +0800 CST

READ UNCOMMITTED 隔离级别中的无序结果?

  • 0

在隔离(数据库系统)的维基百科页面上,在解释脏读时,它说:

在 READ UNCOMMITTED 隔离级别中唯一可以防止的是更新在结果中出现乱序;也就是说,较早的更新将始终出现在较晚的更新之前的结果集中。

我很困惑在哪种情况下更新会在结果中出现乱序。我认为这是不可能的,而不是 READ UNCOMMITTED 隔离级别避免了什么?

isolation-level
  • 1 个回答
  • 35 Views
Martin Hope
Darkstorm
Asked: 2020-02-09 06:29:23 +0800 CST

动态数据屏蔽读取未提交

  • 0

我已阅读有关 Dynamic Data Masking 的内容,但我心中仍有一个问题。我想知道这种情况会发生什么: 1. 表 2 上设置了动态数据屏蔽。ETL 进程正在使用 NOLOCK 提示加载新行(未提交读取) 3. 在数据加载期间,执行带有未提交读取隔离级别的 select 语句获取“脏读”行。

这个“脏数据”是否会被屏蔽?

sql-server isolation-level
  • 1 个回答
  • 41 Views
Martin Hope
Offir
Asked: 2019-10-25 06:51:24 +0800 CST

MSSQL - 什么是网站的最佳隔离级别

  • 0

网站数据库的推荐隔离级别是多少?

sql-server isolation-level
  • 1 个回答
  • 73 Views
Martin Hope
mslot
Asked: 2019-09-28 22:57:53 +0800 CST

SQL Server 的可序列化隔离级别是否锁定整个表

  • 12

我和我的一位同事讨论了使用可序列化隔离级别的含义。他说它锁定了整个表,但我不同意告诉他它可能会,但它会尝试应用范围锁并且它不应用真正的序列化,如此处所述:可序列化隔离级别。

我在文档中也找不到“锁定整个表”的任何内容:SET TRANSACTION ISOLATION LEVEL。

该文档说明了一系列有关范围锁的内容,因此理论上您可以通过简单地使用范围锁来锁定整个表,该范围锁可以锁定表中可能值的整个范围,但它不会锁定表。

我在这里完全错了吗?它实际上是否锁定了整个表(或表)?

sql-server isolation-level
  • 2 个回答
  • 3080 Views
Martin Hope
Mateus Viccari
Asked: 2019-08-29 06:32:39 +0800 CST

SQL Server - 如何同时实现 READCOMMITED 和 NOLOCK?

  • 5

如果我有一个用户表:

id | name   | age
1  | Mateus | 27

第一个事务执行更新,并使事务保持打开状态,不提交或回滚:
update User set name = 'John' where id = 1;

同时,第二个事务执行一个选择:
select * from User where id = 1;
该命令将等待第一个事务通过提交或回滚释放锁,除非第二个事务使用表提示with(nolock),如下所示:
select * from User with(nolock) where id = 1;
这将返回记录而不锁定事务,但是它将返回未提交的值John而不是原始的Mateus.

据我所知,只有两种方法可以在不锁定当前事务的情况下返回锁定的记录,一种可以使用with(nolock)将返回记录但具有未提交值的方法,并且with(readpast)不会返回记录。

有没有办法可以返回记录,而不锁定表,并返回它的“旧”值?

sql-server isolation-level
  • 1 个回答
  • 378 Views
Martin Hope
Yury Oparin
Asked: 2019-08-25 08:23:44 +0800 CST

不同 id 上的 PostgreSQL 序列化失败

  • 4

可序列化隔离模式可用于在插入相等的 id 时避免竞争条件。因此,create table u(uid int primary key, name text);如果我们运行两个类似的事务 T1 和 T2:

begin isolation level serializable;
select * from u where uid = 1;

然后继续 T1 和 T2:

insert into u (uid, name) values (1, 'A');

只有第一个成功commit;,而另一个引发序列化失败。

这是该模式的一个非常简洁的功能,可以处理复杂交易中的唯一密钥违规,而不是诉诸特定的“黑客” insert ... on conflict。但是,即使 uid 不同,例如uid = 2and uid = 3,事务 T1 和 T2仍然无法提交。

怎么可能?假设他们创建不同的谓词 SIReadlocks 并select使用索引扫描。诀窍在哪里?

postgresql isolation-level
  • 1 个回答
  • 607 Views
Martin Hope
Peyman Tahghighi
Asked: 2019-04-28 12:00:03 +0800 CST

锁表实现中隔离级别的区别

  • 0

我正在尝试使用 c++ 和 mysql 在数据库中实现锁表。我正在使用 tpc-a 基准测试,我模拟了一个迷你银行数据库,并在其上运行了一堆线程,每个线程同时执行 10 个事务,目标是在所有事务完成工作后保持一致性。这是一段代码,它是 for 循环的一部分,每个线程运行 10 次:

g_lockTableAccount->lockRecord(hashInt(randomAccountNumSource, g_numAccount), randomAccountNumSource, GetCurrentThread());
    startTransaction(conn);
    //get first account balance and branch.
    {

        std::string query = "SELECT account_balance,branch_ID from `account` WHERE account_ID = " + std::to_string(randomAccountNumSource) + ";";
        executeQuery(conn, query);
        MYSQL_RES * res = mysql_use_result(conn);
        MYSQL_ROW row = mysql_fetch_row(res);

        sourceAccountBalance = toInt(row[0]);
        sourceAccountBranch = toInt(row[1]);
        mysql_free_result(res);

    }
    //--------------------------------------------------------------------
    sourceAccountBalance -= amount;
    {
        std::string query = "UPDATE `Account` SET account_balance = '" +
            std::to_string(sourceAccountBalance) + "' where account_ID = " + std::to_string(randomAccountNumSource) + ";";
        executeQuery(conn, query);

    }
    //--------------------------------------------------------------------
    commitTransaction(conn);
    g_lockTableAccount->unlockRecord(hashInt(randomAccountNumSource, g_numAccount), randomAccountNumSource);

我用相同的模式锁定和解锁其他记录。但我觉得它有问题,因为我认为运行 sql 命令并提交它的模式是不正确的,但问题是当我在 for 循环开始时开始事务并在结束时提交这种模式会导致死锁,因为在任何隔离级别,数据库都不会释放它获得的锁。我怎样才能正确地做到这一点而不会陷入僵局?到底有没有?不同的隔离级别如何影响这个问题?

mysql isolation-level
  • 1 个回答
  • 59 Views
Martin Hope
Unnikrishnan R
Asked: 2019-02-13 22:58:17 +0800 CST

是否可以用特定事务的 ReadCommitted 隔离级别覆盖 ReadCommittedSnapshot 隔离级别?

  • 2

我的数据库的默认隔离级别是“读提交快照”。请看下面的截图。

读取提交的快照

我的数据库中有包含以下数据的表“Tickets”。

在此处输入图像描述

现在在连接 1 中,我开始一个隔离级别为“已提交读取”的新事务。我要将#TicketID“2”的优先级更新为“中”

在此处输入图像描述

从连接 2,我试图访问#TicketID“2”的详细信息。并且它仍然从由读取提交快照隔离创建的版本存储中获取值,这不是预期的行为。

在此处输入图像描述

根据文档,如果事务使用“已提交读取”隔离级别,则在事务执行提交/回滚之前,任何其他事务都无法访问该行。

谁能告诉我为什么在给定的情况下没有发生这种情况?我也很想知道,为什么事务级别的隔离不能覆盖在数据库级别设置的默认隔离级别(此处为读取提交的快照)?


为了更清楚地说明事务范围的隔离覆盖,我提供了以下信息。

我已将我的数据库隔离设置为读取已提交。

在此处输入图像描述

现在在连接 1 中,我正在启动我的事务以更新票证优先级。

在此处输入图像描述

在连接 2 中,我正在尝试访问记录。但这不会完成,因为事务隔离级别处于“已提交读”模式。

在此处输入图像描述

在连接 3 中,我试图访问隔离级别为“读取未提交”的记录。在这里我们可以看到记录,因为它将覆盖在数据库级别设置的默认隔离。

在此处输入图像描述

当我在数据库级别设置“快照隔离”并在另一个事务范围内覆盖它时,我期待相同的行为。对我来说,它总是从版本存储中返回最后提交的值,而不管事务范围中提到的隔离级别如何。我希望我清楚地表达了我的担忧.. :)

sql-server isolation-level
  • 2 个回答
  • 645 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