Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多线程环境中的SQL Server存储过程_C#_Sql Server_Multithreading_Stored Procedures - Fatal编程技术网

C# 多线程环境中的SQL Server存储过程

C# 多线程环境中的SQL Server存储过程,c#,sql-server,multithreading,stored-procedures,C#,Sql Server,Multithreading,Stored Procedures,我需要以线程安全的方式执行一些Sql server存储过程。目前我正在使用软件锁(C#locks)来实现这一点,但不知道Sql server本身提供了什么样的功能来实现线程安全。Sql server似乎内置了一些表和行锁定功能 另外,从性能角度来看,什么是最佳方法?软件锁?还是Sql Server内置锁 谢谢, Shamika客户端的线程与数据库行为关系不大。SQL Server是一个多用户数据库,因此任何人都可以同时在不同的机器上对数据库执行任何操作,而世界上所有的线程安全都不会对此有所帮助。

我需要以线程安全的方式执行一些Sql server存储过程。目前我正在使用软件锁(C#locks)来实现这一点,但不知道Sql server本身提供了什么样的功能来实现线程安全。Sql server似乎内置了一些表和行锁定功能

另外,从性能角度来看,什么是最佳方法?软件锁?还是Sql Server内置锁

谢谢,
Shamika

客户端的线程与数据库行为关系不大。SQL Server是一个多用户数据库,因此任何人都可以同时在不同的机器上对数据库执行任何操作,而世界上所有的线程安全都不会对此有所帮助。SQL Server将在事务期间使用锁来维护数据库,以确保维护ACID规则和所有数据库约束

通常,当您在同一线程上的一台计算机上执行存储过程时,它们将是连续的,不会发生冲突。如果您有多个线程或使用ADO.NET的异步功能,那么这些过程可能会在SQL Server中相互干扰(即阻塞或死锁),但SQL Server将处理所有这些。显然,在这种情况下,应用程序中围绕它们的任何代码都需要是线程安全的——即,不能对两个请求使用相同的IAsyncResult句柄,需要确保两个线程都不会因为完成而试图修改相同的数据,等等


您需要更清楚地列出您的需求,因为这是两种完全不同的锁定场景。

客户端的线程与您的数据库行为几乎没有关系。SQL Server是一个多用户数据库,因此任何人都可以同时在不同的机器上对数据库执行任何操作,而世界上所有的线程安全都不会对此有所帮助。SQL Server将在事务期间使用锁来维护数据库,以确保维护ACID规则和所有数据库约束

通常,当您在同一线程上的一台计算机上执行存储过程时,它们将是连续的,不会发生冲突。如果您有多个线程或使用ADO.NET的异步功能,那么这些过程可能会在SQL Server中相互干扰(即阻塞或死锁),但SQL Server将处理所有这些。显然,在这种情况下,应用程序中围绕它们的任何代码都需要是线程安全的——即,不能对两个请求使用相同的IAsyncResult句柄,需要确保两个线程都不会因为完成而试图修改相同的数据,等等


您需要更清楚地列出您的需求,因为这是两种完全不同的锁定场景。

您的存储过程是做什么的?如果它们是面向事务的,那么不管有多少线程同时执行它。存储的进程是做什么的?如果它们是面向事务的,那么不管有多少线程同时执行它。在我应用程序中最简单的存储过程中,在向表中添加新记录之前,我首先检查是否存在。我需要以线程安全的方式执行此操作。@Shamika-这不会是线程安全问题,除非另一个线程将插入同一行(为什么您的应用程序会这样做?)。我插入到数据库的数据来自一个我无法控制的外部数据库。尽管我应该从外部数据库中获取唯一的键字段,但我发现有时情况并非如此。因此,在将这些记录插入数据库之前,我需要执行此唯一密钥验证。数据插入是多线程的。@Shamika我只需在存储过程中以事务中不存在(INSERT)的简单方式处理它,并在表上设置适当的唯一约束。在我的应用程序中最简单的存储过程中,在向表中添加新记录之前,我首先检查是否存在。我需要以线程安全的方式执行此操作。@Shamika-这不会是线程安全问题,除非另一个线程将插入同一行(为什么您的应用程序会这样做?)。我插入到数据库的数据来自一个我无法控制的外部数据库。尽管我应该从外部数据库中获取唯一的键字段,但我发现有时情况并非如此。因此,在将这些记录插入数据库之前,我需要执行此唯一密钥验证。数据插入是多线程的。@Shamika我只需在存储过程中以事务中不存在(INSERT)的简单方式处理它,并在表上设置适当的唯一约束。无需在应用程序中处理线程。