标签: isolation-level

多个线程可以在约束集上导致重复更新吗?

在postgres中,如果我运行以下语句

update table set col = 1 where col = 2
Run Code Online (Sandbox Code Playgroud)

在默认READ COMMITTED隔离级别,来自多个并发会话,我保证:

  1. 在单个匹配的情况下,只有1个线程将获得ROWCOUNT为1(意味着只有一个线程写入)
  2. 在多匹配的情况下,只有1个线程将获得ROWCOUNT> 0(意味着只有一个线程写入批处理)

postgresql transactions isolation-level

6
推荐指数
1
解决办法
1919
查看次数

"设置交易隔离级别无法解读"没有采取?还是我看错了路?

我们遇到一些显然以错误的隔离级别执行的数据库代码的问题.在代码的这个特定部分中,它应该以"READ UNCOMMITTED"执行以最小化锁.此时数据不一致是可以的.

但是,代码实际上是使用READ COMMITTED读取的,我们无法弄清楚原因.

这是我们做的:

  1. 打开连接
  2. 在此连接上执行"SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED"
  3. 打一个断点
  4. 执行SQL

在断点处,我们向数据库发出以下命令:

select s.session_id, s.transaction_isolation_level, st.text from sys.dm_exec_sessions s
inner join sys.sysprocesses sp on (sp.spid = s.session_id) 
CROSS APPLY sys.dm_exec_sql_text(sp.sql_handle) st
Run Code Online (Sandbox Code Playgroud)

这个SQL现在报告了4个池化连接,其中一个是我们的连接,我们可以超越断点来执行我们的SQL,具有以下状态:

53  2   SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
Run Code Online (Sandbox Code Playgroud)

即.会话53具有隔离级别2(READ COMMITTED),并且在此会话上执行的最后一个SQL是"SET TRANSACTION ..."命令.

怎么会这样?

我们使用SQL事件探查器验证了在我们的.NET代码打开它之前这个连接没有生效,所以它没有从连接池中重用.

然而,通过新的连接,并且在其上执行的唯一和第一个SQL明确告诉它使用READ UNCOMMITTED,连接如何仍然是READ COMMITTED?

我们应该在这看什么?

连接字符串(带有编辑的位)如下所示:

SERVER=hostname;DATABASE=dbname;Integrated Security=false;USER ID=sa;PASSWORD=****;Application Name=appname;Type System Version=SQL Server 2000;Workstation ID=hostname;
Run Code Online (Sandbox Code Playgroud)

连接是正常SqlConnection连接,以正常方式打开.

不幸的是,如果我们编写打开SqlConnection的正常代码,我们就无法重现问题,所以必须有应用程序状态的东西,但是因为SqlProfiler和Sql Server都告诉我们是,所以SQL被执行了,但是没有,我不在乎.

有什么可以影响这个?

完全相同的代码也打开其他连接,即代码执行多次并打开许多连接,因此多个连接最终在池中,但只有第一个连接最终出现此问题.

这是SQL Server 2008 R2,我们也在2012年重现了这个问题.

编辑

好的,还有一些信息.

首先,我们正在启用池化,或者更确切地说,我们没有明确禁用池,也没有将连接字符串弄为"N"池.

但是,此连接是第一个使用此特定连接字符串打开的连接,因此不会从池中检索它.另请参阅我的下面的说明,它永远"生病".

此连接正在设置如下:

var …
Run Code Online (Sandbox Code Playgroud)

sql-server transactions read-uncommitted isolation-level

6
推荐指数
1
解决办法
6048
查看次数

Oracle equivalent of SQL Server Snapshot isolation

In Microsoft SQL Server, I use the READ_COMMITTED_SNAPSHOT ISOLATION

ALTER DATABASE MyDatabase
SET ALLOW_SNAPSHOT_ISOLATION ON

ALTER DATABASE MyDatabase
SET READ_COMMITTED_SNAPSHOT ON
Run Code Online (Sandbox Code Playgroud)

In Session 1,update the Principal from 4000 to 5000

BEGIN TRAN
Update MyTable Set Principal=5000 Where InvestorId=10 
Run Code Online (Sandbox Code Playgroud)

Now in Session 2, I say

Select Principal from MyTable where InvestorId=10
Run Code Online (Sandbox Code Playgroud)

I get 4000, since the Session 1 Transaction is not committed.

If I do not use the READ_COMMITTED_SNAPSHOT isolation mode, and use

  1. READ COMMITTED ISOLATION Mode then my Session 2 …

sql oracle snapshot-isolation isolation-level read-committed-snapshot

6
推荐指数
1
解决办法
6567
查看次数

MySQL Workbench会话看不到数据库更新

我在使用.deb的Ubuntu系统中安装了MySQL Workbench(community-6.2.3)。

工作台会话似乎看不到其他会话(应用程序/命令行客户端)对数据库的更新(DML)。
一个新的会话可以在开始时看到数据库的正确状态,但是看不到其后发生的任何更改。
似乎在工作台中提交后,工作台会话确实与db同步。

我收到Error Code: 1412. Table definition has changed, please retry transaction 的时候我尝试查询表,我已经从不同的会话创建。

非工作台会话似乎没有任何这些问题。

我是否缺少配置或其他内容?


更新:

这部分是预期的行为,部分是错误

没有使用自动提交模式,在这种情况下,SELECT语句是使用第一次读取时建立的快照执行的。
这是REPEATABLE READ隔离级别的行为,该级别已由MySQL Workbench使用。

有没有办法更改或设置MySQL Workbench会话的默认隔离级别?

在工作台中执行时:

SELECT @@Global.tx_isolation, @@tx_isolation, @@session.tx_isolation;
Run Code Online (Sandbox Code Playgroud)

返回:

READ-COMMITTED, REPEATABLE-READ, REPEATABLE-READ
Run Code Online (Sandbox Code Playgroud)

相对于命令行客户端:

READ-COMMITTED, READ-COMMITTED, READ-COMMITTED
Run Code Online (Sandbox Code Playgroud)

相关:
MySQL REPEATABLE-READ Workbench事务级别未设置
MySQL Workbench和默认会话隔离级别

mysql transaction-isolation mysql-workbench isolation-level

6
推荐指数
1
解决办法
1831
查看次数

存储过程SQL Server的隔离级别?

我想在我的程序中添加隔离级别,为此我想从下面确认哪一个是正确的格式:

尝试#1 - 在调用存储过程之前设置隔离级别:

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

EXEC [sp_GetProductDetails] 'ABCD','2017-02-20T11:51:37.3178768'
Run Code Online (Sandbox Code Playgroud)

尝试#2 - 在存储过程中设置隔离级别:

CREATE PROCEDURE MySP AS
BEGIN
   SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
   BEGIN TRAN 
       SELECT * FROM MyTable
       SELECT * FROM MyTable2
       SELECT * FROM MyTable3

       COMMIT TRAN  
END
Run Code Online (Sandbox Code Playgroud)

请建议.

stored-procedures isolation-level sql-server-2012

6
推荐指数
1
解决办法
4507
查看次数

悲观锁在数据库中如何工作,隔离级别与它有什么关系吗?

我正在阅读有关数据库锁定(悲观,乐观)机制的内容,

会话 1:
t1:打开事务:
t2:睡眠(3 秒)
t5:updte 用户集 name='x' 其中 id =1

会话 2:t2:更新用户集 name='y' 其中 id=1

我的疑问是: 1. t5 时会发生什么 2. 它是否与隔离级别有任何关系?如果是,不同隔离级别下的行为是什么。3.数据库(mysql,oracle)只做悲观锁吗?

mysql database locking isolation-level pessimistic-locking

6
推荐指数
1
解决办法
3796
查看次数

EF Core中具有IsolationLevel的BeginTransaction

我正在尝试重写旧库以使用EntityFramework Core,但我不知道如何以特定的隔离级别开始事务。

以前,我能够执行以下操作:

DbContext.Database.BeginTransaction(IsolationLevel.Snapshot);
Run Code Online (Sandbox Code Playgroud)

EntityFramework Core中的替代实现是什么?

entity-framework isolation-level entity-framework-core

6
推荐指数
1
解决办法
2070
查看次数

“可重复读”和“快照隔离”有什么区别

可重复读定义为

更高的隔离级别,即除了保证读提交级别外,还保证读到的任何数据都不会发生变化,如果事务再次读取相同的数据,会发现之前读到的数据就位,不变,可用阅读。

这似乎与快照隔离非常相似。

可重复读取与快照隔离级别有何不同?

sql database isolation-level

6
推荐指数
1
解决办法
1279
查看次数

事务隔离级别 - 选择正确的级别

我是一个sql初学者,我需要有关事务隔离级别的帮助.我需要知道哪种隔离级别最适合以下情况以及原因:

数据库中有3个表:

  • 动物(通过插入芯片注册)KEY - ID_CHIP REF CHIPS
  • 芯片(可以但不必插入动物)KEY - ID_CHIP.其中一个属性是"INSERTED_BY",它引用第三个表PEOPLE(给出插入芯片的人的ID,如果没有插入则为NULL)
  • 人 - KEY:ID

现在让我们考虑以下事务:将一个新芯片插入动物中.更新数据库的人必须改变两件事:

  • 向ANIMALS添加新实体
  • 更新插入的芯片记录(将INSERTED_BY属性从NULL更改为插入芯片的人的ID)

第二个事务是控制器事务,它检查ANIMALS中的实体数是否等于具有INSERTED_BY属性不等于NULL的CHIPS的数量.下图显示了一种情况: 情况

谁能告诉我哪种四肢隔离级别最好?为什么?我被困在这里..任何帮助将不胜感激.

sql sql-server transactions isolation-level

5
推荐指数
1
解决办法
883
查看次数

SQL Server-是否有所谓的“脏写”之类的东西?

SQL Server是否允许事务修改另一个事务当前正在修改但尚未提交的数据?在任何隔离级别下都可以做到这一点,比如说“读未提交”,因为这是限制性最低的吗?还是完全阻止了这种情况的发生?如果可能的话,您会称之为“脏写”吗?

sql-server locking transactions isolation-level

5
推荐指数
1
解决办法
4451
查看次数