Tag: transactions

围绕SqlTransaction回滚的exception处理

我有两个存储过程,我想在事务中执行包装。 由于各种原因,我需要在我的应用程序代码中而不是在数据库中处理事务。 目前,我的代码如下所示: try { using (SqlConnection conn = Connection()) { conn.Open(); using (SqlTransaction sqlTrans = conn.BeginTransaction()) { try { using (SqlCommand cmd1 = new SqlCommand(“Stored_Proc_1”, conn, sqlTrans)) { cmd1.CommandType = CommandType.StoredProcedure; cmd1.ExecuteNonQuery(); } using (SqlCommand cmd2 = new SqlCommand(“Stored_Proc_2”, conn, sqlTrans)) { cmd2.CommandType = CommandType.StoredProcedure; cmd2.ExecuteNonQuery(); } sqlTrans.Commit(); } catch { sqlTrans.Rollback(); throw; } […]

来自Machine.Config的maxTimeout值未被C#winform应用程序获取

我一直在使用Oracle 10g数据库的winform应用程序,它正在使用TransactionScope并想修改machine.config文件中指定的maxTimeOut值,我的machine.config文件位于以下位置(我正在使用.net 4这个应用程序) C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config 最初没有为maxTimeOut指定任何内容,因此它默认为10分钟。 为了更改它,我添加了maxTimeout=”00:00:10″值,如下所示: 我重新启动了PC并运行了一个持续时间超过此时间的测试 – 但是事务在10秒后似乎没有中止,而是使用了TransactionScopeOption参数中指定的scopeOption.TimeOut值(5分钟)并且事务超时5分钟后。 我是否已将maxTimeout值包含在上方的正确位置? 文件中是否有任何需要更改的内容? 为什么没有使用machine.config中maxTimeout的值? 谢谢

使用finally而不是catch

我现在已经看过这种模式了几次: bool success = false; try { DoSomething(); success = true; } finally { if (!success) Rollback(); } 我一直在想:为什么这比使用catch回滚更好? try { DoSomething(); } catch { Rollback(); throw; } 确保更改在失败时回滚的两种方法之间有什么区别?

在SQL Server中自动提交事务使用什么隔离级别?

当我使用SNAPSHOT隔离级别处理更新冲突问题时,似乎自动提交事务使用上次使用的隔离级别。 条件:ALLOW_SNAPSHOT_ISOLATION为ON,READ_COMMITTED_SNAPSHOT为OFF 步骤1:执行没有事务的更新语句 using (var sqlconn = new SqlConnection(“Data source=…”)) using (var sqlcmd = sqlconn.CreateCommand()) { sqlconn.Open(); sqlcmd.CommandText = “Update …” sqlcmd.ExecuteNonQuery(); } 然后我看一下sys.md_exec_sessions ,发现事务隔离级别是sys.md_exec_sessions 。 步骤2:使用SNAPSHOT隔离级别的事务执行update语句 using (var sqlconn = new SqlConnection(“Data source=…”)) { sqlconn.Open(); using (var sqltran = sqlconn.BeginTransaction(IsolationLevel.Snapshot)) using (var sqlcmd = sqlconn.CreateCommand()) { sqlconn.Open(); sqlcmd.CommandText = “Update …” sqlcmd.ExecuteNonQuery(); } } […]

TransactionScope的层次结构

是否可以拥有事务范围的层次结构? 如果外部事务范围进行了处理,那么内部事务范围内所做的更改会发生什么变化? 我的特殊问题是我有运行具有事务范围的代码的测试代码。 当我用事务范围调用第二组代码时,我得到“无法访问已处置的对象。事务”。 可能是内部事务范围的处置也在处理外部事务范围。

如何使用c#在firebird中执行事务(或多个sql查询)

我尝试了几种方法,包括在SO上。 以下MYSQL代码在Firebird中不起作用: CREATE TABLE publications ( INT NOT NULL AUTO_INCREMENT , PRIMARY KEY (`id`), filename varchar(500) not null unique, title varchar(500) DEFAULT NULL, authors varchar(1000) DEFAULT NULL, uploader int DEFAULT NULL, keywords varchar(500) DEFAULT NULL, rawtext text, lastmodified timestamp default CURRENT_TIMESTAMP ); 所以要在Firebird中实现这一点,我正在使用: CREATE TABLE publications ( id int NOT NULL PRIMARY KEY, filename varchar(500) […]

DTC防火墙要求?

我正在尝试建立一个环境,在该环境中,源自Web服务器(asp.net)的TransactionScope将通过WCF将事务流向应用程序服务器,然后再流向数据库。 由于我被迫使用SQL Server 2005数据库,这通常会导致事务被“提升”为分布式事务(可以在此TransactionScope中包装多个服务调用),这意味着需要启用分布式事务协调器。 我已经成功地在一个本地机器上工作,其中Web服务器和应用服务器托管在同一台机器上,连接到远程数据库。 DTC在端口135上进行RPC连接(以及上限)的通信。 我没有两个盒子设置来测试……对于DTC工作,是否需要打开端口135(从防火墙的角度来看)以便在Web服务器和应用程序服务器之间进行通信,或者只是在应用程序服务器上进行通信到数据库? 我从部署人员那里得到了关于从网络开放135到app服务器的回击,想知道这是否是必要的。 我还没有找到在线的doc,为我澄清这一点。 一种边缘问题,希望能有一些可能遇到过这种情况的人提供一些见解。 问候, GA

如何回滚与LINQ to SQL相关的事务?

问题只是回滚变化,而不是提交。 假设我获取了一些数据,我更改了它们,我提交了更改(可选步骤)并且我回滚了事务。 无论你在哪里看每个作者写,这都会取消更改。 但我发现这是半真的 – LINQ DataContext将保留更改的数据! 我使用TransactionScope和DataContext.Transaction测试了这个。 在这两种情况下,我都有相同的行为。 解决方法是在回滚后重新创建DataContext(但这会导致其他问题,如缓存数据和处理嵌套事务)或手动丢弃DataContext中的更改。 然而,这些只是解决方法。 问题 那么我错过了什么? LINQ to SQL不适合交易吗? 如何使用交易,以便他们真的回滚变化? 例 MyTable record = null; db.Connection.Open(); using (db.Transaction = db.Connection.BeginTransaction()) { record = db.MyTable.First(); record.BoolField = !record.BoolField; // changed db.SubmitChanges(); db.Transaction.Rollback(); }

ADOentity framework是否支持非DTC交易? 一个EntityContext和一个TransactionScope内的多个查询导致DTC升级

我有一个使用entity framework的Web应用程序 – 我们使用TransactionScope类来提供环境事务。 有没有办法告诉EF使用标准T-SQL事务优先于DTC事务? 我们经常在一个EntityContext和一个TransactionScope实例中对不同的表进行大量查询,但这似乎总是将事务提升到DTC 我举了一个简短的例子,见下文。 对单个表的查询正确地启动了一个T-SQL事务并且在连接SPID 54上然后查询到ContactUs表并且EF在另一个连接(SPID 53)上执行此操作,该连接具有促进事务的连接效果到DTC交易。** using (MyEntities DB = new MyEntities()) { using (TransactionScope t = new TransactionScope()) { DB.Individual.First().EmailAddress = “bob” + DateTime.Now.Second.ToString() + “@bob.com”; // done on connection 54 DB.ContactUs.First(); // done on connection 53 thus promoting the transaction!! DB.SaveChanges(); t.Complete(); } }

C# – 业务层中事务的使用(SQLServer 2005 +,Oracle) – 很好的例子

我将使用3层架构构建服务,我真的很担心如何以事务处理方式处理操作。 我知道我有两个选择: IDbTransaction和TransactionScope ……但我并没有真正决定去哪一个,尽管我做了很多研究。 我会选择TransactionScope,但我不想涉及DTC …而且我需要支持SQLServer2005和Oracle。 (我知道我需要一次只打开一个连接) 我希望看到两种情况下使用它们的良好示例/模式…良好的链接可以做得很好。 类似于BL类和DAL类的样子……还有如何在它们之间创建和传递事务/连接。 编辑1:我正在寻找一些实现这个(但两个选项): using(var scope = new TransactionScope()) { // transactional methods datalayer.InsertFoo(); datalayer.InsertBar(); scope.Complete(); } 编辑2:由于丹尼斯为我提供了一个非常好的选择…我还在等待有人向我展示一个模型的好例子,它使用’ TransactionScope ‘在业务层和数据层之间进行交互 谢谢。