Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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# 事务应在.NET或SQL Server中处理?_C#_Sql Server_Sql Server 2008_Sql Server 2005 - Fatal编程技术网

C# 事务应在.NET或SQL Server中处理?

C# 事务应在.NET或SQL Server中处理?,c#,sql-server,sql-server-2008,sql-server-2005,C#,Sql Server,Sql Server 2008,Sql Server 2005,我进入了一个应用程序,它使用.NET/C作为前端,SQL Server 2008作为后端。我发现事务总是用c代码处理的。对于这个项目来说,不应该在存储过程中使用事务似乎是一条不成文的规则 我个人认为应该在存储过程中处理事务,因为它可以对代码进行更多的控制!尽管我们不需要打开事务,但脚本中可能会发生很多验证。我们需要在执行插入/更新/删除之前打开一个事务,并尽快关闭它 寻找答案,帮助我了解处理事务的最佳实践,以及何时我们需要选择存储过程中的事务。没有硬性规定,但我看到了从业务层控制事务的几个原因:

我进入了一个应用程序,它使用.NET/C作为前端,SQL Server 2008作为后端。我发现事务总是用c代码处理的。对于这个项目来说,不应该在存储过程中使用事务似乎是一条不成文的规则

我个人认为应该在存储过程中处理事务,因为它可以对代码进行更多的控制!尽管我们不需要打开事务,但脚本中可能会发生很多验证。我们需要在执行插入/更新/删除之前打开一个事务,并尽快关闭它


寻找答案,帮助我了解处理事务的最佳实践,以及何时我们需要选择存储过程中的事务。

没有硬性规定,但我看到了从业务层控制事务的几个原因:

  • 跨数据存储边界的通信。事务不必针对RDBMS;它们可以针对各种实体

  • 基于业务逻辑回滚/提交事务的能力,您正在调用的特定存储过程可能无法使用这些业务逻辑

  • 在单个事务中调用任意查询集的能力。这也消除了对事务计数的担忧

  • 个人偏好:c#有一个更优雅的声明事务的结构:使用块的
    。相比之下,我总是发现存储过程中的事务在跳到回滚/提交时非常麻烦

我们可能会在脚本中进行很多验证 虽然我们不需要公开交易。我们需要开一笔交易 在我们执行插入/更新/删除并尽快关闭之前

这可能是问题,也可能不是问题,取决于打开了多少事务(不清楚这是单个作业还是高并发运行的过程)。我建议查看对象上放置了哪些锁,以及这些锁被保持了多长时间

请记住,验证可能锁定;如果在验证数据和执行操作之间数据发生了变化,该怎么办


如果是一个问题,您可以将有问题的过程分成两个过程,并从
TransactionScope
外部调用一个过程。没有严格的规则,但我认为有几个原因可以从业务层控制事务:

  • 跨数据存储边界的通信。事务不必针对RDBMS;它们可以针对各种实体

  • 基于业务逻辑回滚/提交事务的能力,您正在调用的特定存储过程可能无法使用这些业务逻辑

  • 在单个事务中调用任意查询集的能力。这也消除了对事务计数的担忧

  • 个人偏好:c#有一个更优雅的声明事务的结构:使用块的
    。相比之下,我总是发现存储过程中的事务在跳到回滚/提交时非常麻烦

我们可能会在脚本中进行很多验证 虽然我们不需要公开交易。我们需要开一笔交易 在我们执行插入/更新/删除并尽快关闭之前

这可能是问题,也可能不是问题,取决于打开了多少事务(不清楚这是单个作业还是高并发运行的过程)。我建议查看对象上放置了哪些锁,以及这些锁被保持了多长时间

请记住,验证可能锁定;如果在验证数据和执行操作之间数据发生了变化,该怎么办

如果是一个问题,您可以将有问题的过程分成两个过程,并从
事务范围
外部调用一个过程