实验细节:
我在Microsoft SQL Server管理工作室中运行它。 在我运行的一个查询窗口中:
BEGIN TRANSACTION a;
ALTER table <table name>
ALTER column <column> varchar(1025)
另一方面,我跑:
SELECT 1
FROM sys.objects
WHERE name = ' <other_table name>'
或者这个:
SELECT 1
FROM sys.objects
WHERE object_id = OBJECT_ID(N'[<other_table name>]')
由于某些原因,在我提交tranaction之前,select = name =不会返回。
我正在做事务来模拟我们在DB中有时使用的alter column的长时间操作。我不想伤害其他行动。
答案 0 :(得分:0)
这是因为您在默认事务隔离级别下工作,即ReadCommited。
阅读通讯
在显式开始事务时,在Read Commited Trasanction隔离级别下,Sql Server获取资源上的Exclusive锁,以保持数据完整性并防止用户进行脏读。一旦开始事务并使用某些行,其他用户将无法看到它们的行,直到您提交事务或回滚。然而,这是sql server的默认行为,这可以在不同的事务隔离级别下更改,例如在Read Uncommited下您将能够读取正在被其他用户修改/使用的行,但是您可能有脏读“数据您认为仍在数据库中,但其他用户已更改它。“
我的建议
如果Dirty Reads是你可以忍受的东西,那么
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITED;
最好不要坚持Sql Server的默认行为,让用户稍等一下,而不是给他们脏/错数据。我希望它有所帮助。
的修改
如果两个查询在相同或不同的隔离级别下执行,那么查询正在执行的隔离级别是重要的并不重要,并且当您使用显式事务时,您必须具有Read Uncommited事务隔离级别。如果您希望其他用户在事务期间访问数据。不推荐和不好的做法,我个人会使用Snapshot Isolation,它将广泛使用tempdb,并且只显示最后提交的数据。