当前位置: 首页 > 面试题库 >

SQL Server触发器内的存储过程调用是否隐含线程安全和原子性?

印成天
2023-03-14
问题内容

我有一个SQL Server触发器。老实说,我不确定触发器是否隐式地跟在ACIDAtomicity, Consistency, Isolation, Durability)后面,但是目前,我的触发器没有做任何特别复杂的事情。

现在,我想从触发器中调用存储过程。我已经TRANSACTION围绕存储过程调用和一条INSERT语句。

我的问题是:如果触发器(没有存储过程调用)是线程安全的和原子的(至少部分是由于以下原因),TRANSACTION存储过程调用是否隐式是线程安全的和原子的?

触发器如下所示:

CREATE TRIGGER [triggerInsert_Foobar] 
ON [Foobar]
INSTEAD OF INSERT
AS 
BEGIN
    SET NOCOUNT ON;

    -- Turns on rollack if T-SQL statement raises a run-time error
    SET XACT_ABORT ON

    -- Start new transaction
    BEGIN TRANSACTION
        -- Insert statement for trigger
        INSERT INTO Foo ( Col1, Col2 )
            SELECT 
                RTRIM ( LTRIM ( Col1 ) ), 
                Col2
            FROM 
                INSERTED

    -- Call stored procedure (takes no parameters)
    EXECUTE sp_executesql N'FoobarApp_DoSomething'

    -- Complete transaction
    COMMIT TRANSACTION
END;

谢谢您的帮助。

附加问题

几个回答已经准备好了,这个问题已经准备好了(谢谢)。我事先表示歉意。

我的触发器和随后对存储过程的调用是否遵循ACID原则,并避免出现竞争情况和死锁?或者,是否需要在触发器和/或存储过程中添加某些内容以防止出现竞争情况和死锁?


问题答案:

基础操作和触发操作被视为原子操作。他们都承诺一次交易。从文档中:

触发器和触发它的语句被视为单个事务。

请注意,触发器(和SP将被调用)不会看到触发触发器的表更改。它尚未承诺。



 类似资料:
  • 我们正在尝试使用以下查询将数据流式传输到postgres 11: 基本上“在表中插入记录,如果它已经存在 - 我们希望将此查询连接到消息队列,并在多个实例中的高并发环境中运行它。使用此查询,可能会从不同的连接访问同一行。对我们来说,只有具有最高交付时间戳的项目最终才能进入表是至关重要的 根据文件: 在冲突时,DO UPDATE保证原子插入或更新结果;如果没有独立的错误,那么即使在高并发的情况下,这

  • 本文向大家介绍sqlserver中存储过程的递归调用示例,包括了sqlserver中存储过程的递归调用示例的使用技巧和注意事项,需要的朋友参考一下 递归式指代码片段调用自身的情况;危险之处在于:如果调用了自身一次,那么如何防止他反复地调用自身。也就是说提供递归检验来保证适当的时候可以跳出。 以阶层为例子说存储过程中递归的调用。 递归 当创建此存储过程时候,会遇见一条报告信息

  • 问题内容: 我一直在假设线程安全也不是线程安全,但是在最近的一次讨论中,一位同事告诉我线程安全。 因此,我做了一些研究,却一无所获。很多人认为它是线程安全的,很多人认为它不是线程安全的。而且,最重要的是,文档没有以一种或另一种方式说任何话,不是为了,甚至不是。 那是什么呢? 问题答案: 这是指向Java 7 中Calendar和GregorianCalendar的源代码的链接。 如果阅读该代码,您

  • 问题内容: 我正在使用Spring Data(JPA)存储库来处理CRUD样板。 我这样定义我的存储库接口: 然后Spring自动为我生成上述接口的实现。我们得到的是代理,但我相信最终我们可以归结为。 如果 基础目标类是线程安全的, 则 A 是线程安全的。因此,问题是:线程安全吗? 问题答案: 通常,是的。假设是一个托管对象,我们将从Spring的工厂类(如果您使用Spring作为容器)或CDI托

  • 本文向大家介绍SQLSERVER对加密的存储过程、视图、触发器进行解密(推荐),包括了SQLSERVER对加密的存储过程、视图、触发器进行解密(推荐)的使用技巧和注意事项,需要的朋友参考一下 加密测试的存储过程 解密的存储过程 文件——>新建——>数据库引擎查询 服务器名称:admin:.或者admin:服务器名称 登录进去执行解密操作 为了安全起见,不要在正式环境进行解密,避免在解密过程中将原存

  • 问题内容: 我试图在postgres 9.3上使用sql调用函数内的函数。 这个问题与我的另一篇文章有关。 我写了下面的函数。到目前为止,我还没有合并任何类型的save-output(COPY)语句,因此我试图通过创建嵌套函数print-out函数来解决此问题。 以上功能有效。 尝试创建嵌套函数。 调用嵌套函数。 输出 上面给出了这个。但是,当在print_out()中将arg1,arg2替换为’