Questions tagged «isolation-level»

对于有关“隔离级别”的问题-该设置指定多用户数据库系统中适用的并发性和一致性保证。

4
ALLOW_SNAPSHOT_ISOLATION和READ_COMMITTED_SNAPSHOT
大部分的论坛和榜样的网上总是建议同时拥有ALLOW_SNAPSHOT_ISOLATION并READ_COMMITTED_SNAPSHOT设置为ON,每当别人问快照,行版本或类似的问题。 我猜这两种设置中的SNAPSHOT这个词都会让人有些困惑。我认为,为了使数据库引擎使用行版本控制而不是READ_COMMITTED默认行为的锁定,无论使用什么设置,数据库READ_COMMITTED_SNAPSHOT都设置为ON 。ALLOW_SNAPSHOT_ISOLATION 该ALLOW_SNAPSHOT_ISOLATION设定被设定为ON只允许快照隔离启动事务(例如SET TRANSACTION ISOLATION级快照)时无论的READ_COMMITTED_SNAPSHOT设置。 将这两个设置设置为ON的唯一原因是当它需要具有READ COMMITTED行版本控制和 快照隔离功能时。 我的问题是,我的理解在某种程度上不正确吗?并且这两个设置必须始终一起设置为ON(特别是对于READ COMMITTED行版本控制)?

3
使用SELECT-UPDATE模式时管理并发
假设您有以下代码(请忽略这很糟糕): BEGIN TRAN; DECLARE @id int SELECT @id = id + 1 FROM TableA; UPDATE TableA SET id = @id; --TableA must have only one row, apparently! COMMIT TRAN; -- @id is returned to the client or used somewhere else 在我看来,这不能正确地管理并发。仅仅因为您有一笔交易并不意味着其他人不会获得与您获得更新语句之前相同的值。 现在,将代码保持原样(我意识到这可以更好地作为单个语句处理,甚至可以使用自动增量/标识列更好地进行处理),有什么确定的方法可以使其正确处理并发并防止允许两个客户端获得相同竞争条件的竞争条件。 id值? 我非常确定,将WITH (UPDLOCK, HOLDLOCK)SELECT 添加到SELECT即可。该SERIALIZABLE事务隔离级别(因为它拒绝任何人阅读你做了什么,直到移植是在将似乎工作,以及UPDATE:这是假见马丁的答案)。真的吗?他们俩会平等地工作吗?是一个比另一个更好的选择吗? 想象一下,做比ID更新更合法的事情-基于需要更新的读取进行一些计算。可能涉及许多表,其中一些将要写入,而有些则不会。最佳做法是什么? 写完这个问题后,我认为锁定提示会更好,因为那样的话,您只锁定了所需的表,但是我很感谢任何人的投入。 PS:不,我不知道最佳答案,并且确实希望得到更好的理解!:)

3
进行未提交的SET事务隔离级别的好处
我SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED在大多数常规SQL查询中使用了大多数方法,主要是因为这是在最初学习该语言时钻到我身上的。 根据我的理解,此隔离级别的行为方式与WITH (NO LOCK)我曾经倾向于使用的方式相同SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED。 有没有时间我应该WITH (NO LOCK)用完SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED。 是否 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED阻止其他用户被锁定在我正在读取的表之外? 如果 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED用于停止锁,但是我仅在读取数据,那么使用它有什么意义?只是系统密集型查询会生成锁吗?在运行将在5到10秒内返回的查询时,是否值得使用它? 我被告知不要 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED在读取将用于更新的数据时使用,大概是为了避免更新脏数据。这是唯一的原因吗? 对于我正在处理的数据库类型,有一个生产和测试环境。我们很少会查询生产环境,但是在需要时,通常会SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED在查询中使用它。我知道这样做可能会导致脏读。除了接收可能不会最终提交给数据库的数据(因此将我的结果排除在外)之外,还有哪些其他类型的“脏读”是可能的? 很抱歉出现大量问题。

2
在提交之前,InnoDB在哪里存储交易数据?
我做了使用一些测试READ_COMMITTED,并READ_UNCOMMITTED在家里,使用JDBC技术。 我看到它READ_UNCOMMITTED实际上可以读取未提交的数据,例如,来自尚未提交的某些事务的数据(可以执行UPDATE查询)。 问题 未提交的数据存储在哪里,以便一个READ_UNCOMMITTED事务可以从另一个事务中读取未提交的数据? 为什么READ_COMMITTED事务不可能读取未提交的数据,即执行“脏读”?哪种机制强制执行此限制?

4
MySQL InnoDB甚至在READ COMMITTED中也将主键锁定在删除状态
前言 我们的应用程序运行多个线程,这些线程DELETE并行执行查询。这些查询会影响隔离的数据,即,不可能存在并发DELETE发生在来自不同线程的同一行上。但是,对于每个文档,MySQL DELETE均对语句使用所谓的“下一个键”锁定,该锁定既锁定匹配键又锁定一些间隙。这会导致死锁,我们发现的唯一解决方案是使用READ COMMITTED隔离级别。 问题 执行DELETE具有JOINs个大表的复杂语句时会出现问题。在特定情况下,我们有一个带有警告的表,该表只有两行,但是查询需要从两个单独的INNER JOINed表中删除属于某些特定实体的所有警告。查询如下: DELETE pw FROM proc_warnings pw INNER JOIN day_position dp ON dp.transaction_id = pw.transaction_id INNER JOIN ivehicle_days vd ON vd.id = dp.ivehicle_day_id WHERE vd.ivehicle_id=? AND dp.dirty_data=1 当day_position表足够大时(在我的测试案例中有1448行),那么即使使用READ COMMITTED隔离模式的任何事务也会阻塞整个 proc_warnings表。 这个问题始终重现这个样本数据- http://yadi.sk/d/QDuwBtpW1BxB9都在MySQL 5.1(在59年1月5日检查)和MySQL 5.5(在MySQL 5.5.24检查)。 编辑:链接的示例数据还包含查询表的架构和索引,为方便起见,在此处复制: CREATE TABLE `proc_warnings` ( `id` int(11) NOT NULL AUTO_INCREMENT, …


2
在IsolationLevel.ReadUncommitted上发布的共享锁
我读到,如果我使用IsolationLevel.ReadUncommitted,则查询不应发出任何锁。但是,当我对此进行测试时,看到了以下锁: 资源类型:HOBT 请求模式:S(共享) 什么是HOBT锁?与HBT(堆或二叉树锁)有关的东西吗? 为什么我还会得到S锁? 如何在不打开隔离级别快照选项的情况下进行查询时避免共享锁定? 我正在SQLServer 2008上对此进行测试,并且快照选项已设置为off。该查询仅执行选择。 我可以看到Sch-S是必需的,尽管SQL Server似乎没有在锁查询中显示它。它怎么仍然发出共享锁?根据: 设置事务隔离级别(Transact-SQL) 在该READ UNCOMMITTED级别运行的事务不会发出共享锁,以防止其他事务修改当前事务读取的数据。 所以我有点困惑。

4
我可以在SET TRANSACTION ISOLATION LEVEL SERIALIZABLE之后添加提交的读取吗?
在存储过程中,我具有以下内容:(sql server 2008) SET TRANSACTION ISOLATION LEVEL SERIALIZABLE BEGIN TRANSACTION getStuff BEGIN TRY /* some selects, updates, etc, etc. */ .... COMMIT TRANSACTION getStuff END TRY BEGIN CATCH ... END CATCH 由于这是基于事务的,因此我认为其余的数据库连接将不受SERIALIZABLE的影响。 我是否需要隐式设置隔离级别以在提交后读取提交?这会对我的应用程序服务器和数据库服务器之间的其他连接产生不利影响吗?

3
SQL Server-非阻塞选择语句的隔离级别是多少?
我有一个运行很长时间的事务(称为T1),该事务在SQL Server 2008 R2中的表上执行一些删除,更新和插入操作。同时,另一个进程会定期运行该表中的select语句。 在默认隔离设置下(我认为是READ COMMITTED吗?),T1会阻止所有select语句运行,直到事务提交或回滚为止。 我希望看到的是即使事务正在进行中,select语句也可以在一致的数据上起作用。我相信SNAPSHOT隔离可以提供帮助,但是不确定我的方向是否正确。这是此应用程序的最佳隔离级别吗? 其次,我对调用select语句的过程没有任何控制,但对调用T1的.NET应用程序有控制。在select语句和T1上是否都需要进行任何隔离级别更改,或者仅将T1标记为具有不同的隔离级别就足够了吗?

2
SQL Server的可序列化隔离级别是否锁定整个表
我和我的一位同事讨论了使用可序列化隔离级别的含义。他说它锁定了整个表,但是我不同意告诉他它有可能,但是它尝试应用范围锁,并且没有应用真正的序列化,如下所述:Serializable Isolation Level。 我在文档中也找不到“锁定整个表”的任何内容:SET TRANSACTION ISOLATION LEVEL。 该文档陈述了有关范围锁的许多信息,因此从理论上讲,您可以通过仅具有范围锁来锁定整个表,该范围锁可以锁定表中可能值的整个范围,但不会锁定表。 我在这里完全错了吗?它是否实际上锁定了整个表?

1
在SQL Server 2017和Azure SQL DB中查找默认隔离级别
我正在读一本与交易和并发有关的书。在一个段落中提到: 在本地SQL Server实例中,默认隔离级别是基于锁定的已读提交 接下来的句子是: SQL数据库中的默认值为读取-基于行版本的已提交快照 我的问题是:这两个句子中的“本地SQL Server实例”和“ SQL数据库”之间有什么区别? 什么是默认隔离级别,如何找到它?是否有任何特殊查询来查找默认隔离级别?

1
从表返回的重复记录,没有重复项
我有一个存储过程,用于查询繁忙的队列表,该表用于在我们的系统中分配工作。有问题的表在WorkID上具有主键,并且没有重复项。 该查询的简化版本是: INSERT INTO #TempWorkIDs (WorkID) SELECT W.WorkID FROM dbo.WorkTable W WHERE (@bool_param = 0 AND ((W.InProgress = 0 AND ISNULL(W.UserID, -1) != @userid_param AND (@bool_filtered = 0 OR W.TypeID IN (SELECT TypeID FROM #Types AS t))) OR (@bool_param = 1 AND W.InProgress = 1 AND W.UserID != @userid_param) OR …

3
“当连接关闭并返回到池时,保留来自最后一个SET TRANSACTION ISOLATION LEVEL语句的隔离级别”?
MSDN在线文章“ SQL Server中的快照隔离 ”指出: “隔离级别具有连接范围的范围,并且一旦使用SET TRANSACTION ISOLATION LEVEL语句设置了连接,它将一直有效,直到关闭连接或设置另一个隔离级别为止。当关闭连接并返回到池中时,则保留了最后一个SET TRANSACTION ISOLATION LEVEL语句的隔离级别。后续重用池化连接的连接将使用在池化连接时生效的隔离级别。” 这是不矛盾的段落(“直到”还是“保留”)? 然后,如果在关闭连接并将其返回到池之后,“ 保留了与最后一个SET TRANSACTION ISOLATION LEVEL语句的隔离级别”,则应如何理解: 默认隔离级别将具有任意值(池中的不同连接将具有不同的隔离级别,并且其值将取决于重新打开的连接)? 还是池中所有连接的所有默认值都将更改为最后一个?但是又是未知数吗?

2
SQL Server选择计数READ_COMMITTED_SNAPSHOT问题
在特定表上执行select count(*)时,似乎出现了很多死锁。我已经更改了所有必需的参数,并将它们设置为仅行锁定。 我还更改了数据库以使用READ_COMMITTED_SNAPSHOT隔离, 但是,似乎使用select count(*),其中column =?在表上触发死锁或表上的锁。 我是否正确地认为select count(*)应该只访问中间行?但是,似乎不是那样,并且我仍然遇到死锁。正确的索引编制可能会有所帮助, 问题是:即使将read_committed_snapshot设置为on,SQL Server 2008 R2也会在选择count(*)期间在表上放置共享锁吗? 谢谢

2
使用快照隔离功能,SQL Server数据库写入速度是否变慢?
我的系统中发生了很多僵局。 我想使用快照隔离来修复它们,但是我的DBA对此有保​​留。 他的关注点之一是快照隔离会减慢写入速度。这是因为它必须先写入缓存,然后再写入TempDb(行版本),然后才能返回到调用方。 “正常”写入可以只写入高速缓存,然后完成。 这是行版本控制的工作方式吗?还是比这更复杂?是否以某种方式并行执行这些操作? 还是快照隔离的写入速度较慢?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.