.net - TransactionScopeOption - 必需或 RequiresNew

标签 .net transactions constructor transactionscope

我目前对 TransactionScope 对象的构造函数感到困惑。

假设我网站的用户可以订购产品。提交请求后,我会验证当前剩余数量,如果仍然大于零,我就会执行该请求。然后,最后我减少当前剩余数量。

整个过程都在一个事务内,使用 .NET transactionScope。

阅读了几篇有关 .NET transactionScope 对象的文章后,我现在对用于 transactionScope 构造函数的 TransactionScopeOption 的值有点困惑。

以下哪一项更适合上述情况:

public void ProcessRequest()  
 {  
     TransactionOptions transactionOptions = new TransactionOptions();  
     transactionOptions.IsolationLevel = IsolationLevel.Serializable;  
     using (TransactionScope currentScope = new TransactionScope(TransactionScopeOption.RequiresNew, transactionOptions)) {  
      // DB Query to verify if quantity is still greater than zero  
      // DB Query to request and decrement quantity 
      currentScope.Complete();
     }  
 }  

public void ProcessRequest()  
 {  
     TransactionOptions transactionOptions = new TransactionOptions();  
     transactionOptions.IsolationLevel = IsolationLevel.Serializable;  
     using (TransactionScope currentScope = new TransactionScope(TransactionScopeOption.Required, transactionOptions)) {  
      // DB Query to verify if quantity is still greater than zero  
      // DB Query to request and decrement quantity 
      currentScope.Complete();
     }  
 }  

请注意,以上只是我的实际问题的过度简化。我只想知道这种情况下 TransactionScopeOption 的正确值(RequiresNewRequired)。

感谢您的回复。

最佳答案

如果另一个方法在另一个事务内调用ProcessRequest,这取决于您希望发生的情况:

public void SomeOtherMethod() {
    using (TransactionScope ts = new TransactionScope()) {
        // Another DB action
        ProcessRequest();
        // Yet another DB action
    }
}

如果您希望 ProcessRequest 使用 SomeOtherMethod 创建的事务,请使用 TransactionScope.Required。这是默认设置(当您调用它时,它仍然会创建一个事务,而无需在调用堆栈上创建另一个事务范围)。

如果您希望强制此方法始终使用自己的(新)事务,请使用 TransactionScope,RequiresNew

关于.net - TransactionScopeOption - 必需或 RequiresNew,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4629245/

相关文章:

c# - .NET 如何通过套接字获取 int C-Sharp

c# - 使用异步 CTP 同时下载 HTML 页面

.net - Double 和 Decimal 的精度(在 .NET 中)

c# - 多线程问题——向静态列表中添加一个元素

debugging - 多伦多证券交易所 : Get the address that caused the abort

java - 关于事务和事件监听器

java - .NET 相当于现代 Java Web 架构

c++ - 构造函数内的错误 C2512 : no appropriate default constructor available: declaration of a object with arguments!

java - 难以理解 Java 的构造函数、setter 和 getter

java - 为什么 Java 编译器在构造函数实例化中会丢失对泛型类型的跟踪?