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

这个存储过程是线程安全的吗?(或SQL Server上的任何等效项)

艾骏喆
2023-03-14
问题内容

在SO上其他人的帮助下,今天早上,我离表数据库和存储过程很近,因为我离DB程序员还很远。

有人介意对此加以说明并告诉我它是否是线程安全的吗?我想这可能不是DBA /
DB开发人员使用的术语,但我希望您能理解:基本上,如果此sp正在执行而另一个同时出现又会发生什么呢?一个可以干扰另一个吗?这甚至是SQL /
SP中的问题吗?

CREATE PROCEDURE [dbo].[usp_NewTicketNumber]
    @ticketNumber int OUTPUT
AS
BEGIN
    SET NOCOUNT ON;
    INSERT INTO [TEST_Db42].[dbo].[TicketNumber]
               ([CreatedDateTime], [CreatedBy])
         VALUES
                (GETDATE(), SUSER_SNAME())
    SELECT @ticketNumber = IDENT_CURRENT('[dbo].[TicketNumber]');
    RETURN 0;
END

问题答案:

您可能不希望使用IDENT_CURRENT-这将返回在任何会话和任何范围内的问题表上生成的最新标识。如果其他人在错误的时间插入,您将获得他们的ID!

如果要获取刚刚执行的插入操作生成的标识,则最好使用OUTPUT子句进行检索。为此通常使用SCOPE_IDENTITY(),但是在并行执行计划下存在问题。

与SQL等效的线程安全性主要是在执行多个导致意外或不良行为的语句时执行。我可以想到的这种行为的两种主要类型是锁定(特别是死锁)和并发问题。

当一条语句停止其他语句访问其正在处理的行时,就会发生锁定问题。这可能会影响性能,在最坏的情况下,两个语句会做出无法协调的更改,并且会发生死锁,从而导致一个语句被终止。

但是,除非涉及其他事务(例如数据库事务),否则像您这样的简单插入不应导致锁定。

并发问题(描述得很差)是由对数据库记录的一组更改覆盖了对同一记录的其他更改引起的。同样,在插入记录时这应该不是问题。



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

  • 我读过很多关于Servlet和threadsafe的文章--我知道,“Servlet容器只加载和实例化每个Servlet一次……”。但是,如果我创建抽象类extends Servlet,它有一个用参数处理的方法,那么在后代中使用这个threadsafe吗?

  • 问题内容: 我正在开发一些需要与数据库交互的网站。我不会在这里举一个复杂的例子。我的问题实际上归结为:MySQL过程线程安全吗?如果我站点上的一个客户端触发了一个过程,我可以认为它是原子的,还是会干扰其他用户的另一个请求? 问题答案: 取决于您是否正在使用SQL事务。在没有适当使用事务和实际序列化级别的情况下,过程可能会在写调用中公开某些数据,例如,在完整过程完成之前,其他查询/过程可以看到这些数

  • 问题内容: 在中,此变量被声明为是我的问题,在某些调用之后检查值还是在多线程代码中使用perror()是安全的。这是线程安全变量吗?如果没有,那还有什么选择呢? 我在x86体系结构上将Linux与gcc一起使用。 问题答案: 是的,它是线程安全的。在Linux上,全局errno变量是特定于线程的。POSIX要求errno必须是线程安全的。 参见http://www.unix.org/whitepa

  • 问题内容: 我们在项目中使用了Drools kieSessions。许多线程可以创建新的kieSession。有时在创建会话时线程可能会挂起。因此,问题是: 首先 是kieContainer.newKieSession线程安全操作吗? 上吊的原因可能是肮脏的文字或阅读的kie会话集之类的东西吗? 问题答案: 当我在实践中检查 不是线程安全的操作。

  • 问题内容: 在Java中:线程安全吗,即返回的迭代器是在任何时候反映列表的当前状态,还是仅在创建列表时反映列表的状态? 问题答案: List.iterator()的行为未定义或与其他List实现保持一致。 对于ArrayList,LinkedList,如果在迭代列表时对其进行了修改,则可以获得ConcurrentModificationException。(这不能保证)避免此问题的方法是使用syn