Tag: transactions

使用C#和ODP.NET执行Oracle事务

我糊涂了。 从表面上看,在C#中执行事务似乎很简单。 从这里: http://docs.oracle.com/cd/B19306_01/win.102/b14307/OracleTransactionClass.htm string constr = “User Id=scott;Password=tiger;Data Source=oracle”; OracleConnection con = new OracleConnection(constr); con.Open(); OracleCommand cmd = con.CreateCommand(); cmd.CommandText = “SELECT COUNT(*) FROM MyTable”; // Start a transaction OracleTransaction txn = con.BeginTransaction( IsolationLevel.ReadCommitted); try { // Insert the same row twice into MyTable cmd.CommandText = “INSERT INTO MyTable VALUES (1)”; cmd.ExecuteNonQuery(); cmd.ExecuteNonQuery(); // […]

忽略TransactionScope以进行特定查询

我正在寻找一种在TransactionScope处于活动状态时执行查询的方法,并忽略TransactionScope – 基本上,我想执行此特定查询,无论如何。 我首先使用EF代码,并且设计应用程序的方式,在一次调用中多次打开一个新的数据上下文,每个都有自己的更改,所有这些都包含在一个TransactionScope中,它具有Complete()假设没有失败,最后调用Complete() 。 在上下文中,我们重写了SaveChanges以便在base.SaveChanges()上发生任何exception时,我们可以捕获它并在回滚事务之前登录到数据库。 由于SaveChanges发生在事务内部,因此记录显然不会发生,因为它属于与原始调用相同的事务。 我试图完全忽略TransactionScope的日志代码。 这是一些精简代码: // From the context public override int SaveChanges() { try { return base.SaveChanges(); } catch (Exception ex) { // Writes to the log table – I want this to run no matter what LogRepo.Log(/*stuff to log from the context*/); throw; } } // Inside the business […]

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

只是想知道,如果我想创建一个可以在TransactionScope中使用的类,我想要在TransactionScope中使用,我需要实现什么? 那就是:我的类需要知道它在一个Transaction中,但是如何在Commit或Rollback上得到通知? 在Rollback上,我将如何实际回滚? 我假设我的类将具有“添加”,“更新”和“删除”等方法,这些方法仅修改临时更改列表,以及方法“读取”,需要检测它是否在事务中并返回修改或未修改的数据相应地,但是我需要一个以某种方式调用的方法Commit / Rollback? 我会订阅Transaction.TransactionCompleted事件吗? 如果是,我如何避免对同一交易的多个订阅? 我注意到事务没有ID,有没有办法管理/兼顾多个并发事务或嵌套事务? System.Transactions的MSDN文档有很多内容,但似乎是针对消费者而不是实现者,所以我想知道某人是否有一个良好的来源(无论是在网上还是在书中)关于服务如何提供支持交易? 让我们假设我的类没有已经支持事务的底层存储,并且能够“通过它”。 我们假设我的课看起来像这样: public class MyClass { private List _businessData; public void Create(Myobject data) { … } public MyObject Read(string query) { … } public void Update(Myobject data) { … } public void Delete(Myobject data) { … } }

从try / catch块返回的产量

正如Eric Lippert在本文中所描述的那样, try/catch子句中不允许yield return 。 有没有一种很好的方法可以得到这样的东西,而不必亲自编写我自己的IEnumerator : public IEnumerable GetData() { var transaction = Session.BeginTransaction()); try { IQuery q = CreateQuery(session); foreach (var result in q.Enumerable()) yield return ProjectResult(result); // <– doesn't work session.Commit(); } catch (Exception ex) { transaction.Rollback(); throw; } finally { transaction.Dispose(); } }

SQL Server,C#:事务回滚的超时exception

我有一个奇怪的问题。 我有一个.NET程序,我的进程逻辑需要在SQL Server 2005数据库上运行一个长时间的事务(~20分钟)。 没关系,因为没有人并行访问数据库。 当出现问题时,应该回滚事务。 不常见且没有任何可见模式的DbTransaction对象上的Rollback()操作会抛出DbTransaction : 消息:“超时已到期。在操作完成之前已经过了超时时间,或者服务器没有响应。” 堆栈跟踪: 在System.Data.SqlClient.SqlInternalConnection.OnError(SqlExceptionexception,布尔breakConnection) 在System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) 在System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj,UInt32错误) 在System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult,TdsParserStateObject stateObj) 在System.Data.SqlClient.TdsParserStateObject.ReadPacket(Int32 bytesExpected) 在System.Data.SqlClient.TdsParserStateObject.ReadBuffer() 在System.Data.SqlClient.TdsParserStateObject.ReadByte() 在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,Boolean isDelegateControlRequest) 在System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransactionYukon(TransactionRequest transactionRequest,String transactionName,IsolationLevel iso,SqlInternalTransaction internalTransaction,Boolean isDelegateControlRequest) 在System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransaction(TransactionRequest transactionRequest,String name,IsolationLevel iso,SqlInternalTransaction internalTransaction,Boolean isDelegateControlRequest) 在System.Data.SqlClient.SqlInternalTransaction.Rollback() 在System.Data.SqlClient.SqlTransaction.Rollback() 我不知道这是否真的是一个超时问题,因为代码有时会工作,有时候不会。 此外,我知道的唯一超时是ConnectionTimeout和CommandTimeout […]

在处理时,没有变量的using语句会做什么?

我一直习惯使用变量和赋值。 现在我喜欢这个类DbProviderConnection: public class DbProviderConnection : IDisposable { public DbConnection Connection { get; set; } public DbTransaction Transaction { get; set; } public DbTransaction BeginTransaction() { Transaction = Connection.BeginTransaction(); return Transaction; } //… and so on } 现在我想像这样使用它: using (DbProviderConnection cnctn = _planDb.CreateOpenConnection()) { using (cnctn.BeginTransaction()) { //… cnctn.Transaction.Commit(); } } 我的问题是:是否调用了DbProviderConnection.Transaction.Dispose ?

SqlBulkCopy会自动启动事务吗?

我通过SqlBulkCopy插入数据,如下所示: public void testBulkInsert(string connection, string table, DataTable dt) { using (SqlConnection con = new SqlConnection(connection)) { con.Open(); using (SqlBulkCopy bulkCopy = new SqlBulkCopy(con)) { bulkCopy.DestinationTableName = table; bulkCopy.WriteToServer(dt); } } } 这是否会自动包装在SQL事务中,以便在出现问题时,数据库的一半将保持与批量插入开始之前相同的状态? 或者将插入一半的数据? 即我是否有必要明确调用con.BeginTransaction 或者,如果我调用SqlBulkCopy的构造函数来获取字符串,那么这是一种更好的方法来使它在事务中发生吗? public void testBulkInsert(string connection, string table, DataTable dt) { using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection)) { bulkCopy.DestinationTableName = table; […]

需要C#/ SQL数据库监听器帮助

我需要连续监视数据库行以检查更改(更新)。 如果其他来源有一些更改或更新,应该在我的应用程序上触发事件(我正在使用WCF)。 有没有办法连续监听数据库行以进行更改? 我可能有更多的事件来监视同一个表中的不同行。 在表现方面有任何问题。 我正在使用C#Web服务来监视SQL Server后端。

有没有办法将TransactionScope与现有连接一起使用?

我有一些代码就像建议使用TransactionScope一样,但是有环境连接而不是环境事务。 有没有办法将TransactionScope对象与现有连接一起使用,或者.Net框架中是否有替代方法用于此目的?

TransactionScope:避免分布式事务

我有一个父对象(DAL的一部分),其中包含子对象的集合( List )。 当我将对象保存回DB时,我输入/更新父对象,然后循环遍历每个子对象。 为了可维护性,我将子项的所有代码放入一个单独的私有方法中。 我打算使用标准的ADO事务,但在我的旅行中,我偶然发现了TransactionScope对象,我相信这将使我能够在一个事务中将父方法中的所有数据库交互(以及子方法中的所有交互)包装起来。 到现在为止还挺好..? 接下来的问题是如何在TransactionScope中创建和使用连接。 我听说使用多个连接,即使它们属于同一个DB,也可能迫使TransactionScope认为它是一个分布式事务(涉及一些昂贵的DTC工作)。 是这样吗? 或者是,正如我似乎在其他地方读到的那样,使用相同的连接字符串(它将自己用于连接池)的情况会好吗? 更实际的是,我…… 在父和子中创建单独的连接(尽管具有相同的连接字符串) 在父项中创建一个连接作为参数传递它(对我来说似乎很笨拙) 做点什么……? 更新: 虽然看起来我可以使用我常用的.NET3.5 +和SQL Server 2008+,但这个项目的另一部分将使用Oracle(10g),所以我不妨练习一种可以跨项目使用的技术。 所以我只是简单地将连接传递给子方法。 选项1代码示例: using (TransactionScope ts = new TransactionScope()) { using (SqlConnection conn = new SqlConnection(connString)) { using (SqlCommand cmd = new SqlCommand()) { cmd.Connection = conn; cmd.Connection.Open(); cmd.CommandType = CommandType.StoredProcedure; try { //create & add […]