事务中的触发器是否仅在事务提交时触发?

Pet*_*ter 4 trigger sql-server transaction

我是一名开发人员,但我转向 dba 社区询问以下问题。

我正在用 C# 编写集成测试。在这个测试中,我首先启动一个事务,并且总是回滚,因此无论测试成功还是失败,都不会向数据库提交任何内容。

开始事务后,我在表中插入了一些东西。这个表上有一个插入触发器,但我觉得这个触发器只有在我提交事务时才会触发。

这是真的?

有没有办法让我在交易中触发触发器?

所以在运行时发生的是:

  • 插入表A
    • 触发器被触发并插入表 B

我的测试中发生的事情是:

  • 开启交易
  • 插入表A
  • 检查表 B --> 插入尚未执行

Sco*_*red 7

我对实体框架一无所知,但在以下针对本地实例使用 Sql Server Management Studio 的基本测试中,似乎触发器在插入表 dbo.Test1 完成后触发,我可以立即看到行dbo.Test2 在发出 COMMIT 之前

USE [Test]
GO
IF OBJECT_ID('dbo.Test1', 'U') IS NOT NULL 
    DROP TABLE dbo.Test1
GO
IF OBJECT_ID('dbo.Test2', 'U') IS NOT NULL 
    DROP TABLE dbo.Test2
GO
CREATE TABLE [dbo].[test1](
    [col1] [char](3) NULL
) ON [PRIMARY]

GO
CREATE TABLE [dbo].[test2](
    [col1] [char](3) NULL
) ON [PRIMARY]

GO
CREATE TRIGGER dbo.Test1Trigger 
   ON  dbo.Test1
   AFTER INSERT,DELETE,UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    INSERT INTO dbo.Test2 select * from inserted

END
GO
begin transaction
insert into dbo.test1 (col1) values('abc')
select * from dbo.test2     --The row comes out of the select without issuing a commit
--insert into dbo.test2 (col1) values('xyz')
--commit
--select * from dbo.test2
--rollback
Run Code Online (Sandbox Code Playgroud)