问题标签 [transaction-isolation]
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.
mysql - 当隔离级别为 READ COMMITTED 时,MySQL InnoDB 是否使用 UNION 在多个表上为 SELECT 创建一致的快照
考虑两个这样的表:
这些只是简单的例子......在实际系统中,两个表都有更多的列和更多的行(当前为 10k+ 行,历史为 1M+ 行)。
客户端应用程序不断地(每秒几次)将新行插入到当前表中,并将旧的现有行从当前表“移动”到历史记录(在单个事务中删除/插入)。
在不阻止此活动中的客户端的情况下,我们需要在两个表中为每个部门获取一致的值总和。
将事务隔离级别设置为 REPEATABLE READ 我们可以这样做:
其次是
并将两组结果相加。但是每个查询都会阻止其各自表上的插入。
将隔离级别更改为 READ COMMITTED 并执行相同的两个 SQL 将避免阻塞插入,但现在如果在查询时将条目从当前移动到历史记录,则存在重复计算条目的风险(因为每个 SELECT 都会创建自己的快照)。
那么问题来了....如果我执行UNION,隔离级别READ COMMITTED会发生什么:
MySQL 会同时为两个表生成一致的快照(从而消除重复计算的风险)还是仍然先对一个表进行快照,然后再对第二个表进行快照?
java - 尽管隔离设置为“已提交”,但为什么并发数据库连接会看到彼此未提交的更改?
我正在尝试进行一些测试以了解如何使用事务隔离级别来解决各种并发问题。我从 开始TRANSACTION_READ_COMMITED
,但最简单的情况并不符合我的预期。这是代码:
在这里,我设置了 2 个并发连接,在这两个连接中启动事务,在第一个连接中进行更改,并希望在第二个连接中看不到它们。这不起作用:在连接 1 中所做的未提交更改对连接 2 可见。
我使用以嵌入式模式运行的 HSQLDB 2.3.2 和内存数据库。以下是我的 selectAll/insert 辅助方法的实现:
完整的测试可以在这里找到:https ://gist.github.com/loki2302/aad49a5a2c26d5fda2b3
这段代码有问题,还是 HSQLDB 的行为不符合预期?
更新:重新阅读wiki后,我相信我的想法是错误的。我在这里看到的是“幻读”。READ_COMMITTED
不保证幻读永远不会发生。相反,我应该检查的是,用单行预先填充表,通过更新它connection1
并确保此更改不可见,connection2
除非更改已提交。此外,通常不能保证此更改在提交后立即可见:它可能会变得可见,但不能保证。
jpa - 如何在@Transactional“READ_UNCOMMITTED”中设置隔离级别。我正在使用 EclipseLink 2.5.1-RC1
我需要在正在进行的事务中启动新事务,以便第二个事务中的异常只会回滚新事务而不是旧事务。
我通过在第二个事务中设置传播属性来做到这一点,如下所示:
@Transactional(传播=传播.REQUIRES_NEW)
这创建了一个新的 Transaction,但是新的 Transaction 需要读取第一个事务的一些未提交的数据(脏读),并更新该数据。我试图通过将隔离属性设置为:
@Transactional(传播=传播.REQUIRES_NEW,隔离=隔离.READ_UNCOMMITTED)
这会引发异常 - InvalidIsolationLevelException,说“标准 JPA 不支持自定义隔离级别 - 为您的 JPA 实现使用特殊的 JpaDialect”。
任何人都可以帮助我实施 JpaDialect 吗?我正在使用 Eclipse Link 2.5.1 。
或者我可以在开始新交易之前关闭第一笔交易吗?由于第一个事务关闭,第二个事务读取第一个事务提交的数据没有问题。
mysql - 当有锁时等待读取一行——事务隔离
我想锁定一个表行,以便该行上的任何其他读取操作将等到锁定被释放,并且我想避免锁定整个表。
我有下表(InnoDB)
我执行以下事务以获得对一行的锁定
我希望下面的查询等待锁被释放
为此,我发现的唯一方法是按如下方式运行 SELECT
它将等待锁被释放,但我应该为每个SELECT
表添加自动提交和隔离级别设置。
有没有办法只在表级别autocommit=0
进行配置?transaction-isolation = SERIALIZABLE
我知道我可以设置
in my.cnf
,但我不想影响对其他表和模式进行的其他操作。
参考:
oracle - 两个事务之间的Sql内部查询选择
需要帮助理解两个事务之间的内部查询选择读取
每次执行查询时,我都会更新 SER_NUM = SER_NUM + 1,请求非常强烈,每秒可能有数千个请求。
问题是两个查询事务是否有机会从内部选择中读取相同的值并且两个事务更新相同的值?
有没有一种简单的方法可以让 Transaction-2 等待读取,直到 Transaction-1 完成更新?
正如我从 oracle 文档中看到的,默认隔离是已提交的读取
(Oracle 数据库不会阻止其他事务修改查询读取的数据,该数据可以在两次查询执行之间被其他事务更改。因此,运行给定查询两次的事务可能会遇到不可重复读取和幻像。 )
关于实现这一目标的最佳方法的任何建议?
postgresql - 在备用数据库上运行的可重复读取事务如何看到瞬态?
在有关事务隔离级别的 PostgreSQL 文档中,我们可以阅读以下内容:
虽然在主服务器上的可序列化事务中执行所有永久数据库写入将确保所有备用服务器最终达到一致状态,但在备用服务器上运行的可重复读取事务有时会看到一个瞬态状态,该状态与在主服务器上任何串行执行可序列化事务不一致。掌握。
以上文字在http://www.postgresql.org/docs/9.4/static/transaction-iso.html的底部
在什么情况下,在热备用上运行的可重复读取事务可能会看到不一致的瞬态?
java - 数据库选择语句的并发问题
我有一个问题,我正在考虑在这种情况下使用 databaseisolationtype == Serializable,但是在阅读了一堆文章之后,我仍然不相信这是我下面问题的解决方案。
设置:
我有一张表LAN
,我们根据客户提供的输入选择匹配值。
局域网
现在在业务逻辑中,我需要从 LAN 中选择一个匹配的行并保存另一个表LAN_Assignment
LAN_Assignment
运行 select 语句时,我从 LAN 表中获取匹配行并将其分配给 lan_assignment 表。
现在如果有来自客户端的 5 个请求(可以是集群中的任何服务器),它们都会选择第一个可用的 LAN 并将其保存到另一个表中。
如何确保客户端的第二个请求没有选择拾取 LAN 的第一个请求?
PS:选择语句和业务逻辑并不像这里解释的那么简单。选择LAN并保存到Lan_assignment等有很多条件,
谢谢你
sql - 一致更新表中的多行,隔离并发干扰
我的任务是同步位于不同数据库中的两个表。因此,对于源表中发生的每一次插入、更新和删除,这些更改都必须复制到目标表中。目标表将是源表的克隆。为了实现这一点,我决定在源表中安装触发器。
但我非常担心这些更新的并发方面,因为多个用户同时使用这些表,有时触发器必须更新目标表中的多行。从要在触发器中执行的更改的角度来看,我非常相信逻辑是正确的,但不是关于隔离级别,因为我不是这方面的专家。
因此,我将向您展示负责对目标表进行插入和更新的触发器,并请您查看并发方面是否存在任何问题。但在此之前,让我向您展示表格和一些用例:
这是源表(为简单起见,假设目标表具有相同的结构):
现在假设我在目标表中有这些行:
我想将 id 6 的父部门更改为指向 id 4。更改后的行应该是:
因此,如您所见,只有一行受到更新的影响。现在假设我想将 id 1(即 NULL)的父 id 更改为指向 id 6(在原始行集中)。因此,更改后您将拥有:
因此,在这种情况下,我必须更新多行以更正层次结构。
所以,我希望更改多行以一致地执行,我想我的触发器没有考虑到这一点。这是触发器:
也许从这里改变这些行:
对此:
将解决当前行的问题,但不能解决需要更新的其他行。
如果有人告诉我如何正确地纠正触发器以同时正常工作,我将非常高兴。
先感谢您。
马科斯
postgresql - 用于序列化失败的 PostgreSQL 通用处理程序
这是这个问题的后续问题,所以我知道我可以使用(阻塞)锁,但我想使用谓词锁和可序列化事务隔离。
我想要的是一个序列化失败的通用处理程序,它将重试函数/查询 X 次。
例如,我有这个:
因此,如果mytest()
同时直接调用,我在最后一次提交时会出现序列化失败:
如果我调用myretest()
它,它应该尝试执行mytest()
到第 5 次尝试,它会引发异常。
所以我在这里有两点(也许第 2 点也使第 1 点无效):
myretest()
没有按预期工作,即使在并发线程完成后,每次迭代都会导致 serialiation_failure 异常:我应该添加一些东西来“重置”事务吗?我怎样才能使这个(
myretest()
逻辑)通用,以便它适用于系统中的每个调用函数,而不需要“包装器”函数本身?