當我執行下面的代碼(案例1)我得到值爲2的計數。這意味着在同一個交易中,桌子上的chagnes是可見的。所以這個行爲就像我期望的那樣。SQL服務器事務可見性問題
案例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'」,因爲新添加的列是不可見在同一事務中。
爲什麼會出現這種差異?創建表是原子的(案例1),並以我期望的方式工作,但改變表不是。爲什麼在同一個事務中所做的更改對於下面的語句不可見(案例2)。
你能解釋爲什麼案例1工作,但爲什麼案例2失敗。爲什麼Micosoft以這種方式設計它?我覺得這是不一致的。什麼是技術解釋? –
有批次的規則。其中之一是你不能改變表格,並在同一批次中引用新列,正如另一個答案中所述。情況1:創建表,這是允許的。情況2:表格被改變,這是不允許的。 – OzrenTkalcecKrznaric
@SriwanthaSriAravinda:'編譯錯誤'是**的技術解釋。閱讀文章鏈接瞭解技術解釋。 –