当我执行以下代码(案例 1)时,我得到计数的值 2。这意味着在同一个事务中,对表所做的 chagnes 是可见的。所以这符合我的预期。
情况1
begin tran mytran
begin try
CREATE TABLE [dbo].[ft](
[ft_ID] [int] IDENTITY(1,1) NOT NULL,
[ft_Name] [nvarchar](100) NOT NULL
CONSTRAINT [PK_FileType] PRIMARY KEY CLUSTERED
(
[ft_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
INSERT INTO [dbo].[ft]([ft_Name])
VALUES('xxxx')
INSERT INTO [dbo].[ft]([ft_Name])
VALUES('yyyy')
select count(*) from [dbo].[ft]
commit tran mytran
end try
begin catch
rollback tran mytran
end catch
但是,当我更改一列(例如,在事务中添加新列)时,(自身/相同)事务(案例 2 )不可见。假设有一个产品表没有名为 ft_ID 的列,我正在添加一个具有相同事务的列并读取它。
案例2
begin tran mytran
begin try
IF NOT EXISTS (
SELECT *
FROM sys.columns
WHERE object_id = OBJECT_ID(N'dbo.Products')
AND name = 'ft_ID'
)
begin
alter table dbo.Products
add ft_ID int null
end
select ft_ID from dbo.Products
commit tran mytran
end try
begin catch
rollback tran mytran
end catch
当尝试执行案例 2时,我收到错误“无效的列名 'ft_ID'”,因为新添加的列在同一事务中不可见。
为什么会出现这种差异?Create table 是原子的(案例 1)并且以我期望的方式工作,但 alter table 不是。为什么在同一事务中所做的更改对向下的语句不可见(案例 2)。