问题标签 [read-committed]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
1468 浏览

c# - 在电影院预订系统中处理货币的替代方法

我和我的团队为一个学校项目制作了一个电影院预订系统,该项目的主题是货币控制。它是用 c# 和实体框架在一个 n 层架构中制作的,其中表示层由一个 mvc 项目组成。

我们选择在“选择座位进行预订”阶段使用悲观锁定 (IsolationLevel.ReadCommited),以便在有人检查座位是否可用以及将座位添加到预订时锁定数据库。我目前正在寻找例如乐观并发是否可能是一个选项,如果是的话,它将如何工作。

这是数据库图的图片: 数据库图

当你点击一个特定的节目时,它会自动为你创建一个空的预订,然后用座位和信息构建屏幕(电影院),无论它们是否可用。

以下是创建链接到屏幕(电影院)的座位列表的方法:

通过这种方法,屏幕(电影院)是用座位作为复选框构建的,您可以在其中一次选择多个座位。然后通过 AJAX 调用将您选择的座位与您的 reservationId 一起发送到 TryBookSeats 方法,该方法将首先查看是否有人尝试预订您的座位,如果没有,则通过将它们放置在 ReservationSeats 表中进行预订。

这是 TryBookSeats 方法:

如您所见,我们使用了isolationLevel ReadCommited,我们认为它是悲观锁定,并将确保在将席位添加到ReservationSeats 时不会发生冲突。

而且我认为我们不会遇到任何死锁,因为我们只锁定了一张表。

我知道乐观并发的工作方式之一是在您提交数据库更新之前,您将检查数据库在您检索记录后是否已更改。我们是否可以选择,在将座位(和 reservationId)添加到 reservationSeats 表之前检查它们是否已被保留用于演出。

0 投票
1 回答
65 浏览

mysql - 我们应该使用读提交的隔离级别吗?

我有一个名为“radacct”的 mysql innodb 表。此表包含用户互联网使用记录,如上传、下载、帐户 ID 等(下表架构如下)。该radacct表使用路由器发送的数据以随机间隔更新。我们也使用这张表来计算互联网用户的总带宽,带宽计算查询(选择)大约需要 3-4 秒。当带宽计算查询和来自竞争锁的路由器的更新查询同时执行时,就会出现问题。这是由于 RepeatableRead 锁(表级锁定)和更好地在这里使用 ReadCommitted 隔离?

带宽计算查询

插入/更新查询见mysql> show full processlist;

0 投票
1 回答
270 浏览

hibernate - 如何阅读 - 当请求时 - 仅提交 JPA(避免刷新实体)

据我所经历的,JPA/hibernate 将返回存在于数据库中或在事务期间被持久化然后刷新到数据库中的实体。

我希望某些查询能够按原样向 Hibernate 询问数据库,而不考虑任何活动事务、任何刷新的实体等。在这些特定情况下,我只想阅读它提交的内容。

将刷新模式设置为“提交”这不是我想要的,因为我只想按原样读取数据库 - 跳过刷新的实体 - 在某些情况下,例如调用此 'findCommittedEntities' 方法。

一个简单的代码,显示我在寻找什么:

那么我应该怎么做才能做到这一点呢?还是根本不可能?

至于我正在使用 OSGi 和 Aries JPA/JTA 的环境,但我认为这在这里无关紧要

0 投票
2 回答
2430 浏览

mysql - 为什么我不应该使用“可重复读取”和锁定读取(选择..for update)”?

在 Mysql 文档中:“ https://dev.mysql.com/doc/refman/5.7/en/innodb-deadlocks-handling.html

它提到:“如果您使用锁定读取(SELECT ... FOR UPDATE 或 SELECT ... LOCK IN SHARE MODE),请尝试使用较低的隔离级别,例如 READ COMMITTED。

有人能告诉我为什么我不能使用“可重复阅读”吗?例子会很好。

干杯

0 投票
1 回答
362 浏览

sql - SELECT 是否会阻止返回的行被删除?

说我有:

  1. T1:(SELECT id FROM x WHERE timestamp < y返回id = [1, 2, 3]
  2. T2:DELETE FROM x WHERE id = 1
  3. T1:SELECT timestamp, value FROM x WHERE id = 1

READ-COMMITTED隔离。

第 3 步是否存在返回空结果的风险,或者第 1 步是否获得某种锁定/快照以防止第 2 步更改结果?(我假设REPEATABLE-READ会做我想做的事,但这个问题是关于READ-COMMITTED)。

我正在使用 postgresql,但我对独立于 DB 的答案感兴趣。例如,如果某些数据库阻止删除而其他数据库不阻止,我想知道这一点。谢谢你。

0 投票
0 回答
290 浏览

java - 读提交隔离级别阻塞

我正在尝试理解和使用 spring 事务隔离级别。我需要最大化我的应用程序的并发性,我只需要小心脏读。幻读等场景真的是不用管的。因此决定将Isolation.READ_COMMITTED用于我的应用程序中最常用的事务方法之一。根据春季文档:

此级别仅禁止事务读取其中包含未提交更改的行。

所以这是我所面临的情况,我认为与上述陈述略有不同。

关键方法(customeId):

  1. 从 table1 中读取客户的数据
  2. 做一些决定
  3. 在 table1 中为该客户添加一个新行
  4. 进行一些长时间的处理......

因此,当为两个完全独立的客户 c1 和 c2 并行调用此方法时,如果 c1 的方法在调用 c2 的方法时位于第 4 步。因此,我在步骤 1 中对 c2 块的方法调用对 c1 的 util 方法调用完成。

我用eclipse调试模拟了这个场景。我可以从表 1 上的数据库端为客户 c2 查询数据。根据上面的 spring 文档,我的第二个方法调用不应该被阻塞。

我错过了什么吗?

这是我的技术栈:

  • 爪哇:8
  • 弹簧:4.3.7
  • 数据库:SqlServer 2012
  • ORM:Mybatis 3.4.2
  • mybatis 春季版:1.3.1
0 投票
4 回答
2584 浏览

sql-server - 如果两个事务都不回滚,则已提交读与未提交读

我试图了解读取已提交和未提交的隔离级别。我知道理论上未提交的读取允许脏读,而已提交的读取则不允许,但我仍然无法真正理解。

这个例子

考虑上图,如果没有任何事务被中止,那么读取已提交和未提交读取的最终结果是否相同?

0 投票
1 回答
242 浏览

mysql - InnoDB x-locks 在 READ COMMITTED 隔离级别

来自 MySQL 词汇表:

阅读已提交

当具有此隔离级别的事务执行 UPDATE ... WHERE 或 DELETE ... WHERE 操作时,其他事务可能必须等待。该事务可以执行 SELECT ... FOR UPDATE 和 LOCK IN SHARE MODE 操作,而无需让其他事务等待

那是对的吗?

UPDATE 为它扫描的每一行设置 x 锁,然后释放那些与 WHERE 部分不匹配的锁。剩余的行保持 x 锁直到事务结束。据我所知,SELECT-FOR UPDATE 会发生完全相同的事情。那么 UPDATE 怎么会阻塞其他事务而 SELECT-FOR UPDATE 不会呢?

0 投票
1 回答
596 浏览

sql-server - 防止读取提交的 SELECT 中的死锁

我正在从第三方提供的业务系统中提取数据以用于报告。我正在使用从 SSIS 数据流任务源组件发出的单个 SELECT 语句,该组件跨源系统中的多个表连接以创建我想要的数据集。我们使用默认的已提交读隔离级别。

令我惊讶的是,我经常发现这个提取查询陷入僵局并被选为受害者。我不认为读提交事务中的 SELECT 可以做到这一点,但根据这个 SO 答案可能的:读提交的隔离级别是否会导致死锁(Sql Server)?

通过使用跟踪标志 1204 和 12222,我确定了冲突的语句,以及有问题的对象和索引。本质上,争用是针对其中一个表的主键中的数据页。我需要使用其键上的连接从该表中提取(因此我要取出 S 锁),冲突语句正在执行 INSERT 并请求索引数据页上的 IX 锁。

(旁注:上面的SO谈到了非聚集索引发生的这个问题,但这似乎发生在聚集PK中。至少,根据我对事件日志中死锁信息的解释和“关联对象 ID”属性。)

这是我的限制:

  1. 冲突语句位于第三方提供的加密存储过程中,作为现成软件的一部分。不可能获得或更改明文代码。
  2. 我不想使用脏读,因为我需要提取的数据来保持其完整性。
  3. 我不清楚重组我的提取查询如何或是否可以防止这种情况发生。锁在我最感兴趣的桌子的 PK 上,我看不到使用 PK 的任何替代方案。
  4. 我不介意我的提取查询是受害者,因为我更喜欢这样而不是中断源系统的操作使用。但是,这确实会导致 SSIS 执行失败,所以如果必须这样,我想要一种更干净、更优雅的方式来处理这种情况。

任何人都可以建议最好的方法来防止死锁,或者如果没有,那么更好地处理错误?

0 投票
1 回答
246 浏览

postgresql - Postgres 读取已提交不会重新读取更新的行

再会。我READ COMMITTED在 postgres 中使用隔离级别,发现不符合官方文档的奇怪行为。假设我有一张桌子account(id int,name text,amount int)和两行。

现在我开始两个 READ COMMITTED 事务。第一个执行以下查询

然后第二个执行这个查询

现在它被锁定了,因为第一个事务还没有提交。所以第二笔交易要给总金额大于或等于 1000 的每个账户加 50。由于 Bob 有两个账户(800+200),那么它应该给每个账户加 50。但是,现在第一个事务已提交COMMIT; --1,现在 Bob 总共有 900 个,根据文档读取提交的事务将

重新评估命令的搜索条件(WHERE 子句)以查看行的更新版本是否仍然匹配搜索条件。如果是这样,第二个更新程序使用该行的更新版本继续其操作

据我了解,第二笔交易将重新评估where 条件并跳过 Bob 的帐户。然而,当第二个事务被提交时,最后的行看起来像这样

这意味着第二个事务没有重新评估搜索条件并对行应用更新,即使它们与条件不匹配。为什么会这样。我错过了文档中的某些内容吗?