在postgres中,如果我运行以下语句
update table set col = 1 where col = 2
Run Code Online (Sandbox Code Playgroud)
在默认READ COMMITTED隔离级别,来自多个并发会话,我保证:
我们遇到一些显然以错误的隔离级别执行的数据库代码的问题.在代码的这个特定部分中,它应该以"READ UNCOMMITTED"执行以最小化锁.此时数据不一致是可以的.
但是,代码实际上是使用READ COMMITTED读取的,我们无法弄清楚原因.
这是我们做的:
在断点处,我们向数据库发出以下命令:
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) 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
sql oracle snapshot-isolation isolation-level read-committed-snapshot
我在使用.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和默认会话隔离级别
我想在我的程序中添加隔离级别,为此我想从下面确认哪一个是正确的格式:
尝试#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)
请建议.
我正在阅读有关数据库锁定(悲观,乐观)机制的内容,
会话 1:
t1:打开事务:
t2:睡眠(3 秒)
t5:updte 用户集 name='x' 其中 id =1
会话 2:t2:更新用户集 name='y' 其中 id=1
我的疑问是: 1. t5 时会发生什么 2. 它是否与隔离级别有任何关系?如果是,不同隔离级别下的行为是什么。3.数据库(mysql,oracle)只做悲观锁吗?
我正在尝试重写旧库以使用EntityFramework Core,但我不知道如何以特定的隔离级别开始事务。
以前,我能够执行以下操作:
DbContext.Database.BeginTransaction(IsolationLevel.Snapshot);
Run Code Online (Sandbox Code Playgroud)
EntityFramework Core中的替代实现是什么?
可重复读定义为
更高的隔离级别,即除了保证读提交级别外,还保证读到的任何数据都不会发生变化,如果事务再次读取相同的数据,会发现之前读到的数据就位,不变,可用阅读。
这似乎与快照隔离非常相似。
可重复读取与快照隔离级别有何不同?
我是一个sql初学者,我需要有关事务隔离级别的帮助.我需要知道哪种隔离级别最适合以下情况以及原因:
数据库中有3个表:
现在让我们考虑以下事务:将一个新芯片插入动物中.更新数据库的人必须改变两件事:
第二个事务是控制器事务,它检查ANIMALS中的实体数是否等于具有INSERTED_BY属性不等于NULL的CHIPS的数量.下图显示了一种情况:

谁能告诉我哪种四肢隔离级别最好?为什么?我被困在这里..任何帮助将不胜感激.
SQL Server是否允许事务修改另一个事务当前正在修改但尚未提交的数据?在任何隔离级别下都可以做到这一点,比如说“读未提交”,因为这是限制性最低的吗?还是完全阻止了这种情况的发生?如果可能的话,您会称之为“脏写”吗?
isolation-level ×10
transactions ×4
sql ×3
sql-server ×3
database ×2
locking ×2
mysql ×2
oracle ×1
postgresql ×1