1

实验细节:

我在 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>]')

由于某种原因,在我提交交易之前,带有 name= 的选择不会返回。

我正在做事务来模拟我们有时在我们的数据库中拥有的更改列的长时间操作。我不想损害其他操作。

4

1 回答 1

0

这是因为您在默认事务隔离级别下工作,即 ReadCommited 。
Read
Commited Under Read Committed Trasanction Isolation Level 显式开始事务 Sql Server 获取资源的独占锁以保持数据完整性并防止用户进行脏读。一旦您开始事务并使用某些行,其他用户将无法看到它们的行,直到您提交事务或回滚。然而,这是 sql server 的默认行为,这可以在不同的事务隔离级别下更改,例如在未提交的读取下您将能够读取正在被其他用户修改/使用的行,但是您有可能有脏读“数据您认为仍在数据库中,但其他用户已更改它。”
我的建议
如果脏读是你可以忍受的东西

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITED;

否则最好坚持 Sql Server 的默认行为,让用户稍等片刻,而不是给他们脏/错误的数据。我希望它有所帮助。
编辑

两个查询是在相同还是不同的隔离级别下执行并不重要,重要的是查询在什么隔离级别下执行,并且当您使用显式事务时,您必须具有读取未提交的事务隔离级别。如果您希望其他用户在事务期间可以访问数据。不推荐和不好的做法,我个人会使用快照隔离,它将广泛使用 tempdb,并且只会显示最后提交的数据。

于 2013-11-15T08:36:05.017 回答