简单的问题?
为什么READ_COMMITTED_SNAPSHOT默认情况下不启用?
我猜是向后兼容性,性能还是两者兼而有之?
[编辑]请注意,我对与READ_COMMITTED隔离级别有关的效果感兴趣,而不是快照隔离级别.
为什么这会是一个突破性的变化,因为它拥有较少的锁,并且仍然不会读取非提交的行?
sql-server sql-server-2005 isolation-level read-committed-snapshot
使用SQL Server的事务隔离级别,您可以避免某些不需要的并发问题,例如脏读等.
我现在感兴趣的是丢失更新 - 事实上两个事务可以覆盖彼此的更新,而没有人注意到它.我看到并听到相互矛盾的陈述,至少我必须选择哪种隔离级别来避免这种情况.
Kalen Delaney在她的"SQL Server Internals"一书中说(第10章 - 事务和并发 - 第592页):
在Read Uncommitted隔离中,除了丢失更新之外,前面描述的所有行为都是可能的.
另一方面,一个独立的SQL Server培训师给我们一个课程告诉我们,我们至少需要"可重复读取"以避免丢失更新.
那么谁是对的?为什么?
我需要在每个事务的方式管理的事务隔离级别便携式跨数据库(SQLite的和PostgreSQL,MySQL的至少).
你能推荐一个增强ActiveRecord数据库连接适配器的gem吗?
我知道我可以手动完成,就像那样:
User.connection.execute('SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE')
Run Code Online (Sandbox Code Playgroud)
......但我希望有类似的东西:
User.isolation_level( :serializable ) do
# ...
end
Run Code Online (Sandbox Code Playgroud) ruby activerecord transactions ruby-on-rails isolation-level
我试图了解SQL Server中的隔离/锁定.
我在READ COMMITTED隔离级别中有以下场景(默认)
我们有一张桌子.
create table Transactions(Tid int,amt int)
with some records
insert into Transactions values(1, 100)
insert into Transactions values(2, -50)
insert into Transactions values(3, 100)
insert into Transactions values(4, -100)
insert into Transactions values(5, 200)
Run Code Online (Sandbox Code Playgroud)
现在从msdn我明白了
当选择被触发时,共享锁被占用,因此没有其他事务可以修改数据(避免脏读).文档还讨论了行级,页级,表级锁.我想到了下面的观点
Begin Transaction
select * from Transactions
/*
some buisness logic which takes 5 minutes
*/
Commit
Run Code Online (Sandbox Code Playgroud)
我想要了解的是获取共享锁的持续时间以及(行,页,表).
只有在语句select * from Transactions运行时才会获取锁定,或者在我们达到COMMIT之前将整个5分钟获取锁定.
是否有一个很好的教程/指南/博客文章/书籍章节/截屏/等试图全面涵盖与ActiveRecord中的锁,事务和隔离级别有关的所有内容?(最好与Rails 4.0相关)
指南中有一个简短的部分,当然还有一些API文档,但它是一个非常重要的(对我而言)难以理解的域,这是我第一次在Rails应用程序中认真对待数据完整性.我想得到一个很好的理解,所以我可以做得很好.
已知资源列表
activerecord locking transactions ruby-on-rails isolation-level
我需要以编程方式在SQL Server中启用READ COMMITTED SNAPSHOT.我怎样才能做到这一点?
sql-server transactions isolation-level read-committed-snapshot
也许我误解了有关事务或SQL Server正在做什么的事情,但考虑以下T-SQL:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
GO
BEGIN TRANSACTION
-- DO SOME READS AND OTHER THINGS
COMMIT
-- OK, WHAT HAPPENS TO THE ISOLATION LEVEL AFTER THIS?
Run Code Online (Sandbox Code Playgroud)
也许这没关系,但我喜欢温暖模糊的感觉,一旦我完成了我正在做的事情,我就会像往常一样离开事物.无论之前的状态如何,是否可以将隔离级别重置回原始状态?
我的理解是,当在SELECT语句中使用NOLOCK时,它也可以读取未提交的/脏行.但我想利用表上的NOLOCK提示,以便我的SELECT查询能够快速运行.
现在,NOLOCK在桌上但是与"SET TRANSACTION ISOLATION LEVEL READ COMMITTED"一起给我NOLOCK优势和更快的SELECT查询(因为NOLOCK)只有提交的行(因为SET)?
当SQL Server Books联机表示" 读取操作完成后,资源上的共享(S)锁定被释放" ,除非将事务隔离级别设置为可重复读取或更高,或者使用锁定提示来保留共享( S)在交易期间锁定."
假设我们在默认隔离级别(Read Committed)上讨论的是没有显式事务的行级锁,那么" 读操作 "指的是什么?
注意:我需要知道的原因是我们有一个由数据层Web服务生成的第二个只读select语句,它创建页级共享读锁,由于与行级独占更新锁冲突而生成死锁来自使服务器保持更新的复制程序.select语句相当大,有许多子选择,一个DBA建议我们重写它以将其分解为多个较小的语句(较短的运行部分),"减少锁定持有的时间".因为这假设共享读锁被保持直到完成select语句完成,如果这是错误的(如果在行或页面被读取时释放锁)那么该方法将不会产生任何影响....
试图完全理解SQL Server隔离级别 - 特别是可重复阅读.
我有一个启动事务的sproc并在某些数据周围放置一个光标(boo hiss).这可能是一大块数据,因此可能需要一段时间才能完成.
然后它将COMMIT或ROLLBACK.
在此期间,在事务关闭之前,如果有人调用导致某些受影响的行的方法为READ,我的理解是此方法将停止,直到第一个方法完成.然后他们将被提供数据(只要先没有超时)
我想我是对的,但问题是 - 我是吗?!
isolation-level ×10
sql-server ×7
transactions ×4
locking ×3
t-sql ×3
activerecord ×2
ruby ×1
sql ×1