问题标签 [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 - MySQL REPEATABLE-READ Workbench 事务级别未设置
我们在 my.ini 文件中设置了以下内容
[mysqld] 事务隔离 = READ-COMMITTED
我们假设此设置将是所有用户会话的默认设置。
使用 PHPMyAdmin 登录时,tx_isolation 设置正确并按预期工作。但是,当使用 MySQL Workbench 6.0 连接到服务器时,对变量的检查显示 tx_isolation 级别设置为 REPEATABLE-READ。这种隔离级别的效果也符合预期。
我们希望全局设置事务隔离级别为 READ-COMMITTED,最好是在 DB 启动时。
我们已经重新启动了服务器(V 5.5.25a)和工作台。存储引擎是 INNODB。
sql - 由于事务隔离级别,sql server 一个简单的查询需要永远运行
我在学习 SQL Server 中的事务隔离级别时遇到了一个问题。
问题是,在我运行这段代码之后(并且它没有错误地完成):
我想运行这个查询:
但它只是说“执行查询”,什么都不做。我认为这是因为在第一个事务完成后,表上的锁以某种方式继续存在。有人可以帮忙吗?当然,选择和插入指的是同一个表。
postgresql - 持久设置 PostgreSQL 事务隔离
我想SERIALIZABLE
为所有未来的会话持续设置事务隔离级别,但我只能看到在会话中执行此操作的方法。
如果这是可能的,怎么做?
sql - 如何仅在 SQL Server 中选择未提交的行?
我正在处理需要查询实时 CRM 系统的 DW 项目。标准隔离级别会对性能产生负面影响。我很想使用未提交的无锁/事务隔离级别。我想知道脏读识别了多少选定的行。
sql-server - 在 MS SQL Server 中,如果发生 ReadCommitted,如何在事务期间解锁读取锁?
当我在 MS SQL Server 2008 中启动事务并更新表记录时,除非我提交事务,否则 SQL 服务器会锁定其他用户读取该记录(在隔离级别 = 已提交读的情况下)。
我如何允许其他用户在我的事务期间和我提交之前读取原始值(在 ReadCommitted 的情况下)?
例如:如果我在人员表上启动事务并将人员名称从“Alex1”更新为“Alex2”,在 Readcommitted 隔离级别的情况下,除非我提交事务,否则其他用户无法读取记录!那么如何允许其他用户在我的事务期间读取原始值“Alex1”(我不希望他们读取未提交的值),当我提交它时,他们可以读取提交的值“Alex2 “?
谢谢,
c++ - libpqxx 事务序列化和后果
对于我的实现,必须批量完成特定的写入,并且没有其他干扰的机会。
有人告诉我,以这种方式进行的两个竞争事务将导致第一个事务阻塞第二个事务,而第二个事务可能会在第一个事务完成后完成,也可能不会完成。
请发布确认这一点的文档。此外,如果第一个事务阻塞,第二个事务究竟会发生什么?它会排队、失败还是某种组合?
如果无法确认,是否应该将此事务的事务隔离级别设置为SERIALIZABLE
?如果是这样,如何使用 libpqxx 准备好的语句来完成?
如果事务是序列化的,第二个事务会失败还是排队直到第一个事务完成?
如果任一失败,如何使用 libpqxx 检测到?
sql - 了解 NOLOCK 提示
假设我有一个包含 1,000,000 行的表,并且SELECT * FROM TableName
在该表上运行 a 大约需要 10 秒才能返回数据。
如果没有NOLOCK 语句(将问题放在脏读方面),这个查询是否会将表锁定 10 秒,这意味着没有其他进程可以读取或写入表?
DBA 经常通知我,然后在查询实时数据以诊断数据问题时,我应该使用 NOLOCK 来确保我不会锁定可能给用户带来问题的表。这是真的?
sql - SQL 部分可序列化
我们试图解决的高级问题是防止来自用户启动的 ETL 过程的重复记录,该过程为它正在导入的每一行调用一个过程(这是一种简化,更改设计不是我的一部分问题)。所以基本上我们有这样的东西(注意该表有大约 20 列):
过程 ImportRow(@p1、@p2、@p3 等)
如果不存在( 从 TargetTable 中
选择 1 ,其中 col1 = @p1 AND col2 = @p2 AND col3 = @p3 等)插入目标表(col1,col2,col3...)
值(@p1,@p2,@p3)
所以很明显我们有一个竞争条件,如果两个人无意中同时运行同一个导入器,我们最终会得到重复的记录。
我们愿意使用SERIALIZABLE
以确保IF NOT EXISTS
将阻止第二个事务进行插入...
过程 ImportRow(@p1、@p2、@p3 等)
设置事务隔离级别可序列化
如果不存在( 从 TargetTable(UPDLOCK)中
选择 1 ,其中 col1 = @p1 AND col2 = @p2 AND col3 = @p3 等)插入目标表(col1,col2,col3...)
值(@p1,@p2,@p3)
...但是,如您所知,如果没有覆盖索引,这将锁定整个表...
...我们不能添加覆盖索引,因为我们有 20 列。
但是前两个参数/列基本上是一个“进口商 id”和一个“截止日期”,所以,真的可以只有 THAT 可序列化。换句话说,防止同一个导入器运行不止一次,即锁定粒度在“整个表”和“逐行”之间。像这样的东西:
过程 ImportRow(@importer、@asOfDate、@p3、@p4、@p5 等)
--lock down the importer
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
SELECT 1
FROM TargetTable (UPDLOCK)
WHERE importer = @importer AND asOfDate = @asOfDate如果不存在( 从 TargetTable (UPDLOCK) 中
选择 1 ,其中 importer = @importer AND asOfDate = @asOfDate AND col3 = @p3 AND col4 = @p4 AND col5 = @p5 等)插入目标表(importer,asOfDate,col3,col4,col5 ...)
值(@importer,@asOfDate,@p3,@p4,@p5)
我们在 importer 和 asOfDate 上有一个覆盖索引,所以只有那些应该被序列化锁定,而表的其余部分应该是自由和清晰的。问题是现在这显然会从第一个SELECT
查询中产生一个缓慢而丑陋的结果集。
那么有没有另一种方法来做到这一点“部分可序列化”?我正在考虑烧一个临时表,但这很浪费。
SELECT 1
INTO #Ignored FROM TargetTable (UPDLOCK)
WHERE importer = @importer AND asOfDate = @asOfDate
我能想到的唯一另一件事是将 importer/asOfDate 放在一个单独的表中并给该对一个 id ('importerDateId'),然后在 TargetTable 中使用该 importerDateId,即对其进行更多规范化,但我'想避免架构更改。
java - 如何使用 hibernate 4 实现自定义线程安全序列?
我需要实现一个解决方案来为不同类型但相同类型(相同类,相同表)的对象生成序列号。更重要的是,序列生成的规则是在运行时定义的(起始序列、最大数量等)。我正在使用 MySQL,休眠 MySQL5Dialect 不支持序列生成,因此我选择使用序列表来实现此功能,其中每一行都是不同类型对象的序列:
我创建了一个增加值的 dao:
这从服务层调用为:
我尝试了一切:将隔离级别设置为Isolation.SERIALIZABLE
,以编程方式在方法内提交事务,向其中添加synchronized
关键字,还添加了锁定请求,但我认为它已经过时了,因为已经设置了隔离级别。
尽管如此,如果我创建 100 个线程并从每个线程调用此方法 60 次,结果是该nextVal
列的值约为 4000 而不是 6000。
我怀疑我在这里遗漏了一些非常基本的东西,但找不到按预期工作需要什么。
感谢您的任何提示!
mysql - 什么是 mysql 中的事务隔离我需要更多解释
请问mysql中的事务隔离是什么,它的优势,因为我开始对它进行一些研究,但我仍然需要更多的解释。这就是解决问题的方法