次のコード (ケース 1 ) を実行すると、カウントの値 2 が得られます。つまり、同じトランザクション内で、テーブルに対して行われた変更が表示されます。したがって、これは私が期待する方法で動作します。
ケース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
ただし、列を変更すると (トランザクション内に新しい列を追加するなど)、(self/same) トランザクションには表示されません (ケース 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を実行しようとすると、「Invalid column name 'ft_ID'」というエラーが表示されます。これは、新しく追加された列が同じトランザクション内で表示されないためです。
この食い違いはなぜ起こるのでしょうか?テーブルの作成はアトミック (ケース 1 ) であり、期待どおりに機能しますが、テーブルの変更はそうではありません。同じトランザクション内で行われた変更が下のステートメントに表示されないのはなぜですか (ケース 2 )。