标签: system.transactions

如何创建一个与TransactionScope一起使用的类?

只是想知道,如果我想创建一个可以在TransactionScope中使用的类,我想要在TransactionScope中使用,我需要实现什么?

那就是:我的类需要知道它在一个Transaction中,但是如何在Commit或Rollback上得到通知?在Rollback上,我将如何实际回滚?

我假设我的类将具有"添加","更新"和"删除"等方法,这些方法仅修改临时更改列表,以及方法"读取",需要检测它是否在事务中并返回修改或未修改的数据相应地,但是我需要一个以某种方式调用的方法Commit/Rollback?

我会订阅Transaction.TransactionCompleted事件吗?如果是,我如何避免对同一交易的多个订阅?

我注意到事务没有ID,有没有办法管理/兼顾多个并发事务或嵌套事务?

System.Transactions的MSDN文档有很多内容,但似乎是针对消费者而不是实现者,所以我想知道某人是否有一个关于服务如何提供支持的良好来源(无论是在网络上还是在书中)交易?

让我们假设我的类没有已经支持事务的底层存储,并且只能"通过它".我们假设我的课看起来像这样:

public class MyClass {
    private List<MyObject> _businessData;

    public void Create(Myobject data) { ... }
    public MyObject Read(string query) { ... }
    public void Update(Myobject data) { ... }
    public void Delete(Myobject data) { ... }
}
Run Code Online (Sandbox Code Playgroud)

.net c# transactions .net-4.0 system.transactions

29
推荐指数
1
解决办法
7690
查看次数

使用SqlConnection/System.Transactions进行Session-Per-Request

我刚刚开始使用Dapper进行一个项目,过去几年大多使用像NHibernate和EF这样的ORM.

通常在我们的Web应用程序中,我们按请求实现会话,在请求开始时开始事务并在结束时提交它.

我们应该在直接使用SqlConnection/System.Transactions时做类似的事情吗?

StackOverflow如何做到这一点?

根据@gbn和@Sam Safron的建议,我没有使用交易.在我的情况下,我只是在进行读取查询,因此似乎没有真正的要求使用事务(与我所知道的隐式事务相反).

我创建了一个轻量级的会话接口,以便每个请求都可以使用一个连接.这对我来说非常有益,因为对于Dapper我经常需要创建一些不同的查询来构建一个对象,而宁愿共享相同的连接.

确定每个请求的连接并处理它的工作是由我的IoC容器(StructureMap)完成的:

public interface ISession : IDisposable {
    IDbConnection Connection { get; }
}

public class DbSession : ISession {

    private static readonly object @lock = new object();
    private readonly ILogger logger;
    private readonly string connectionString;
    private IDbConnection cn;

    public DbSession(string connectionString, ILogger logger) {
        this.connectionString = connectionString;
        this.logger = logger;
    }

    public IDbConnection Connection { get { return GetConnection(); } }

    private IDbConnection GetConnection() {
        if (cn == null) {
            lock (@lock) …
Run Code Online (Sandbox Code Playgroud)

sql-server sqlconnection system.transactions dapper

15
推荐指数
1
解决办法
1962
查看次数

跟踪事务升级到DTC的原因

有没有办法确定为什么System.Transaction TrasactionScope被升级到DTC?我们的一个组件似乎升级了交易,而所有其他组件(看起来似乎相似)都没有升级,我们正在碰撞.

是否提供了有关升级原因的信息以及如何找到和遵守这些信息?SQL事件探查器?日志文件?或者我在这个上运气不好?

更新:我正在运行SQL Server 2005以获取信息

msdtc trace system.transactions escalation

12
推荐指数
2
解决办法
4454
查看次数

已禁用分布式事务管理器(MSDTC)的网络访问

错误:

已禁用分布式事务管理器(MSDTC)的网络访问.请使用组件服务管理工具在MSDTC的安全配置中启用DTC以进行网络访问.

using (System.Transactions.TransactionScope ts = new System.Transactions.TransactionScope())   
11                 {   
12                     try  
13                     {   
14                         foreach (DataRow row in this.dt1.Rows)   
15                         {   
16                             int titleId = int.Parse(row["titleId"].ToString());   
17                             string fname = row["fname"].ToString();   
18                             string lname = row["lname"].ToString();   
19   
20                             if (cmd.Parameters.Count > 0)   
21                                 cmd.Parameters.Clear();   
22   
23                             cmd.Parameters.AddWithValue("@titleId", titleId);   
24                             cmd.Parameters.AddWithValue("@fname", fname);   
25                             cmd.Parameters.AddWithValue("@lname", lname);   
26                             cmd.ExecuteNonQuery();   
27   
28                         }   
29                         con.Close();   
30                         ts.Complete();   
31                     }   
32                     catch (Exception ex)   
33                     {   
34   
35                     }                       
36                 }   
37             }  
Run Code Online (Sandbox Code Playgroud)

asp.net system.transactions

12
推荐指数
2
解决办法
3万
查看次数

使用TransactionScope:System.Transactions.TransactionAbortedException:事务已中止

我们正在尝试使用下面的代码.NET 3.5和SQL Server 2005进行间接嵌套事务.

MSDN说,当使用TransactionScope时,只要应用程序在事务中打开第二个连接(甚至是同一个数据库),事务就会升级.

void RootMethod()
{
   using(TransactionScope scope = new TransactionScope())
   {
      /* Perform transactional work here */
      FirstMethod();
      SecondMethod();
      scope.Complete();
   }
 }

void FirstMethod()
{
    using(TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
   {
     using (SqlConnection conn1 = new SqlConnection("Data Source=(local);Initial Catalog=Northwind;Integrated Security=SSPI")) 
       {
     string insertString = @"
             insert into Categories
             (CategoryName, Description)
             values ('Laptop1', 'Model001')";
         conn1.Open();
         SqlCommand cmd = new SqlCommand(insertString, conn1);
         cmd.ExecuteNonQuery();
        }
      scope.Complete();
    }
 }

 void SecondMethod()
 {
    using(TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
   {
       using (SqlConnection conn2 …
Run Code Online (Sandbox Code Playgroud)

.net c# system.transactions

8
推荐指数
2
解决办法
2万
查看次数

避免System.Transactions中的事务升级的策略

因此,基于回答我刚才的问题,交易得到来自LTM到DTC,如果多个连接在一个事务中打开,即使连接都具有相同的连接字符串升高.

所以,我的下一个问题是,可以采用什么策略来避免这种"功能"?在我看来,基于资源使用,我想确保尽可能多地使用LTM.在正确的面向对象的业务逻辑层中,我能想到的唯一方法是在数据访问层创建请求级静态连接对象,并在调用之间共享,直到请求完成(这里隐含的知识)是业务对象实体是谨慎的,不知道他们被调用的是什么顺序,另外一个事实是,人们不希望将连接对象冒泡到业务对象层,因为这将是数据存储实现细节流血到另一层).

有没有其他人有任何想法不会完全破坏n层系统的层封装?

architecture ado.net transactions system.transactions n-tier-architecture

7
推荐指数
1
解决办法
839
查看次数

.net持久资源管理器,用于事务性文件系统访问

我试图围绕在C#中使用System.Transactions命名空间.我在MSDN上找到了一些关于使用资源管理器的文档,但它只涵盖任何细节的易失性内存资源管理器(如Transactional).我基本上在寻找可以在TransactionScope中使用的东西,就像Transactional <>一样,但是用它来写入/修改/删除磁盘上的文件.标准库中是否存在类似的内容?我已经读过NTFS现在有"TxF"允许事务性文件系统访问 - 我期望在.net中找到一些利用它的东西.也许我需要实现自己的?

.net c# ntfs system.transactions txf

7
推荐指数
1
解决办法
1286
查看次数

System.Transactions的实际用途是什么?

我见过System.Transactions命名空间,并且想知道,我是否可以使用此命名空间使用实际生成RDMBS?

但是当我看到一些例子时,我不明白System.Transactions如何做除了简单的try catch以及获得成功/失败结果之外的任何事情?

这是MSDN网站上的示例,我知道它可能非常简单,但我无法理解此示例中的好处,有人可以告诉我以下示例中的简单try/catch和Transaction范围之间有什么区别.

如果我应该创建一个RDBMS(创建我自己的RDMBS),我知道我们必须将大量日志写入我们执行的操作的磁盘,最后我们在回滚的情况下撤消这些操作,但这里什么也没有关于撤消任何事情.

// This function takes arguments for 2 connection strings and commands to create a transaction 
// involving two SQL Servers. It returns a value > 0 if the transaction is committed, 0 if the 
// transaction is rolled back. To test this code, you can connect to two different databases 
// on the same server by altering the connection string, or to another 3rd party RDBMS by 
// altering the code in the …
Run Code Online (Sandbox Code Playgroud)

.net transactions transactionscope system.transactions

7
推荐指数
1
解决办法
4198
查看次数

使用SQL Server 2005上的System.Transactions的TransactionInDoubtException

这篇文章的基本问题是"为什么非升级的LTM交易会受到质疑?"

我收到System.Transactions.TransactionInDoubtException,我无法解释原因.不幸的是我无法重现这个问题,但根据跟踪文件它确实发生了.我正在使用SQL 2005,连接到一个数据库并使用一个SQLConnection,所以我不希望进行促销.错误消息表示超时.但是,有时我得到一条超时消息,但异常是事务已中止而不是有疑问,这更容易处理.

这是完整的堆栈跟踪:

System.Transactions.TransactionInDoubtException: The transaction is in doubt. ---> System.Data.SqlClient.SqlException: Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
   at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)
   at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj)
   at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket()
   at System.Data.SqlClient.TdsParserStateObject.ReadBuffer()
   at System.Data.SqlClient.TdsParserStateObject.ReadByte()
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   at System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest(Byte[] buffer, TransactionManagerRequestType request, String transactionName, TransactionManagerIsolationLevel isoLevel, Int32 timeout, SqlInternalTransaction transaction, TdsParserStateObject stateObj, …

c# transactions sql-server-2005 transactionscope system.transactions

5
推荐指数
2
解决办法
9771
查看次数

跨AppDomains和进程的TransactionScope

跨不同的AppDomain和进程使用System.Transactions(主要是TransactionScope)是真的吗?

DependentTransaction仅在一个AppDomain内部工作.

.net database ado.net transactionscope system.transactions

5
推荐指数
1
解决办法
1435
查看次数