Tag: transactionscope

RavenDB与Transaction Scope不能很好地协作

我有以下测试用例,我希望通过。 但它没有通过RavenDB。 如果我使用MsSql创建完全相同的测试,它确实通过。 var connectionString = “Url=http://localhost:8080”; var store = new DocumentStore(); store.ParseConnectionString(connectionString); store.Initialize(); using (var scope = new TransactionScope()) using (var session = store.OpenSession()) { session.Store(dog); session.SaveChanges(); var dogs = session.Query().Customize(x => x.WaitForNonStaleResults()).ToList(); Assert.AreEqual(1, dogs.Count); scope.Complete(); } 我正在尝试编写一些相同的代码,无论我选择什么数据库,这只是我试图通过的测试用例的一个例子。 我尝试了各种各样的东西,比如waitfornonstaleresults,以及allownonautheitative..something等等。

TransactionScope的层次结构

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

TransactionScope Complete()在退出USING语句之前不提交事务

我遇到这种奇怪的行为,只有在using退出时才提交事务,而不是在调用scope.Complete(); using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew)) { scope.Complete(); // data still doesn’t show in db } // now shows in db 如何在退出using语句之前提交事务?

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 ‘在业务层和数据层之间进行交互 谢谢。

建议的做法是在使用transactioncope时停止升级到分布式的事务

使用TransactionScope对象来设置不需要跨函数调用传递的隐式事务非常棒! 但是,如果连接打开而另一个连接已打开,则事务协调器会静默升级要分发的事务(需要MSDTC服务运行并占用更多资源和时间)。 所以,这很好: using (var ts = new TransactionScope()) { using (var c = DatabaseManager.GetOpenConnection()) { // Do Work } using (var c = DatabaseManager.GetOpenConnection()) { // Do more work in same transaction using different connection } ts.Complete(); } 但这会使交易升级: using (var ts = new TransactionScope()) { using (var c = DatabaseManager.GetOpenConnection()) { // Do […]

是否可以在自定义WCF服务行为中创建TransactionScope? (async,await,TransactionScopeAsyncFlowOption.Enabled)

TL; DR? 截屏解释问题: https : //youtu.be/B-Q3T5KpiYk 问题 将事务从客户端流向服务时Transaction.Current在等待服务调用服务后变为null 。 当然,除非您在服务方法中创建一个新的TransactionScope,如下所示: [OperationBehavior(TransactionScopeRequired = true)] public async Task CallAsync() { using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) { await _service.WriteAsync(); await _service.WriteAsync(); scope.Complete(); } } 为什么默认情况下不启用TransactionScopeAsyncFlowOption我不知道,但我不想重复自己,所以我想我总是使用自定义行为创建一个带有该选项的内部事务管理器。 问题更新 它甚至不必是服务调用服务,等待本地异步方法也使Transaction.Current无效。 用一个例子来澄清 [OperationBehavior(TransactionScopeRequired = true)] public async Task CallAsync() { await WriteAsync(); // Transaction.Current is now null await WriteAsync(); } 试图解决方案 […]

TransactionScope – 基础提供程序在EnlistTransaction上失败。 MSDTC被中止

我们的团队遇到的问题表现为: 基础提供程序在EnlistTransaction上失败; 无法访问已处置的对象。对象名称:’Transaction’。 一旦我们开始使用TransactionScope来处理我们的应用程序的事务,它似乎就出现了。 堆栈跟踪的顶部部分被捕获为: 在System.Data.EntityClient.EntityConnection.EnlistTransaction(事务事务)处的System.Data.Objects.ObjectContext.EnsureConnection()处于System.Data.Objects.ObjectContext.ExecuteStoreCommand(String commandText,Object [] parameters)处于Reconciliation.Models。在EntityDbEnvironment.cs中的Reconciliation.Models.Legacy.EntityDbEnvironment.ExecuteOracleSql(String sql)中的BillLines.BillLines.Reconciliation.Interfaces.IBillLineEntities.ExecuteStoreCommand(String,Object []):第41行 同时更新MSDTC日志,我使用此处的说明提取了该日志: pid=7060 ;tid=7908 ;time=04/29/2013-16:38:30.269 ;seq=136 ;eventid=TRANSACTION_BEGUN ;tx_guid=60f6390c-7570-488a-97a9-2c3912c4ca3e ;”TM Identifier='(null) ‘” ;”transaction has begun, description :”” pid=7060 ;tid=7908 ;time=04/29/2013-16:38:30.269 ;seq=137 ;eventid=RM_ENLISTED_IN_TRANSACTION ;tx_guid=60f6390c-7570-488a-97a9-2c3912c4ca3e ;”TM Identifier='(null) ‘” ;”resource manager #1002 enlisted as transaction enlistment #1. RM guid = ‘defc4277-47a6-4cd9-b092-93a668e2097b'” pid=7060 ;tid=7908 ;time=04/29/2013-16:38:31.658 ;seq=138 ;eventid=RECEIVED_ABORT_REQUEST_FROM_BEGINNER ;tx_guid=60f6390c-7570-488a-97a9-2c3912c4ca3e ;”TM Identifier='(null) […]

没有DTC的TransactionScope替代方案

有什么替代transactionScope不需要启用DTC ?? 在交易中,我需要做两个操作: 创建一个用户(使用成员资格–sql成员资格提供者) 做一次插入操作。

如何在.NET 4.0中使用Microsoft.Bcl.Async支持TransactionScope中的异步方法?

我有一个类似的方法: public async Task SaveItemsAsync(IEnumerable items) { using (var ts = new TransactionScope()) { foreach (var item in items) { await _repository.SaveItemAsync(item); } await _repository.DoSomethingElse(); ts.Complete(); } } 这当然有问题,因为TransactionScope不能与async / await一起使用。 它失败,并带有消息的InvalidOperationException : “TransactionScope必须放在创建它的同一个线程上。” 我在这个答案中读到了TransactionScopeAsyncFlowOption ,这看起来正是我需要的。 但是,对于这个特定项目,我很难支持.Net 4.0,无法升级到4.5或4.5.1。 因此,我的项目中的异步/等待行为由Microsoft.Bcl.Async NuGet包提供 。 我似乎无法在此包或任何其他OOB包中找到TransactionScopeAsyncFlowOption 。 我只是在某处错过了吗? 如果没有,是否有其他方法可以达到相同的效果? 也就是说 – 我希望事务范围正确完成或回滚,尽管跨越线程有延续。 我在上面的例子中添加了DoSomethingElse来说明在事务范围内可能有多个调用,所以在一次调用中简单地将所有项目传递给数据库是不可行的选择。 如果重要,存储库使用直接ADO.Net( SqlConnection , SqlCommand等)写入SQL Server。 UPDATE […]