Tag: 事务

NHibernate会话管理?

首先,让我简要介绍一下这个场景。 我正在编写一个简单的游戏,其中几乎所有工作都在服务器端完成,并且有一个瘦客户端供玩家访问。 玩家登录或创建帐户,然后可以通过在网格中移动来与游戏交互。 当他们进入一个小区时,他们应该被告知该小区中的其他玩家,同样地,该小区中的其他玩家将被告知该玩家进入该小区。 可以进行许多其他交互和操作,但是不值得详细介绍它们,因为它更加相同。 当玩家退出然后重新登录或者如果服务器停机并重新启动,则所有游戏状态都应该持续存在,但是如果服务器崩溃,那么如果我失去10分钟左右的更改则无关紧要。 我已经决定使用NHibernate和一个SQLite数据库了,所以我在NHibernate上阅读了很多内容,按照教程和编写了一些示例应用程序,我对如何应对这个问题感到非常困惑! 我的问题是:管理会话的最佳方式是什么? 只是从我理解的少量,所有这些可能性跳出来对我: 拥有一个始终打开的会话,所有客户端都使用该会话 为每个连接并定期刷新它的客户端设置一个会话 每次我必须使用任何持久化实体时打开一个会话,并在更新,插入,删除或查询完成后立即关闭它 为每个客户端建立一个会话,但保持断开状态,只有在需要使用它时才重新连接 与上面相同,但保持连接状态,并在一段时间不活动后才断开连接 保持实体分离,并且每隔10分钟仅附加一次,例如,提交更改 我可以使用什么样的策略来获得不错的性能,因为每秒可能有数百个客户端可能会有很多更新,插入,删除和查询,而且它们都必须相互一致? 另一个小问题:我应该如何以有效的方式使用交易? 是否可以将每一次更改都放在自己的事务中,或者当我有数百个客户端都在尝试更改网格中的单元格时,这种情况会不会很糟糕? 我是否应该尝试弄清楚如何将类似的更新批量放在一起并将它们放在一个单独的事务中,还是会变得太复杂? 我甚至需要大部分交易吗?

unit testingTransactionScope的使用

序言:我设计了一个强接口和完全可模拟的数据层类,当多个调用应该包含在单个TransactionScope时,期望业务层创建一个TransactionScope 。 问题:我希望unit testing我的业务层在我期望的时候使用TransactionScope对象。 不幸的是,使用TransactionScope的标准模式如下: using(var scope = new TransactionScope()) { // transactional methods datalayer.InsertFoo(); datalayer.InsertBar(); scope.Complete(); } 虽然这对于程序员的可用性而言是一个非常好的模式,但测试它已经完成似乎……对我来说是不可能的。 我无法检测到已经实例化了一个临时对象,更不用说模拟它以确定在其上调用了一个方法。 然而,我的报道目标意味着我必须这样做。 问题:如何构建unit testing以确保根据标准模式正确使用TransactionScope ? 最后的想法:我已经考虑过一个肯定会提供我需要的覆盖范围的解决方案,但是因为过于复杂而且不符合标准的TransactionScope模式而拒绝了它。 它涉及在我的数据层对象上添加CreateTransactionScope方法,该方法返回TransactionScope一个实例。 但是因为TransactionScope包含构造函数逻辑和非虚拟方法,因此很难(如果不是不可能)进行模拟, CreateTransactionScope将返回一个DataLayerTransactionScope实例, DataLayerTransactionScope成为TransactionScope可模拟外观。 虽然这可能做得很复杂,但我更喜欢使用标准模式。 有没有更好的办法?

使用设置为ConcurrencyMode.Multiple和I​​nstanceContextMode.PerCall的WCF服务行为属性时是否可能出现并发问题?

我们有一个WCF服务,可以进行大量的事务NHibernate调用。 偶尔我们会看到SQL超时,即使调用正在更新不同的行并且表被设置为行级锁定。 在深入研究日志之后,看起来不同的线程正在进入代码中的相同点(我们的事务使用块),并且更新挂起在提交上。 但是,这没有意义,因为我们认为以下服务类属性强制每个服务调用一个唯一的执行线程: [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.PerCall)] 我们最近将并发模式更改为ConcurrencyMode.Single并且还没有遇到任何问题,但是这个bug很难重现(如果有人想要刷出这样的bug,请告诉我!)。 无论如何,这一切都让我想到了问题:PerCall的InstanceContextMode是否应该在服务中强制执行线程安全,即使ConcurrencyMode设置为多个? 如何通过同一个服务实例为两个调用提供服务? 谢谢!

SqlTransaction中的SqlDataAdapter.Fill() – 这是一个不好的做法吗?

因为我有一个带有DataSet QueryDB(string spName, DBInputParams inputParams)方法的“DB util”类,我用它来调用数据库,所以我想重用这个方法来支持事务调用。 所以,最后我将在SqlTransaction中有一个SqlDataAdapter.Fill。 这会是一种不好的做法吗? 因为我很少在事务中看到DataAdapter.Fill的使用,更常见的是ExecuteReader()。 有没有捕获? Edit1:事情是我的事务内部经常需要检索一些数据(例如自动ID)…这就是为什么我想把它作为DataSet。 Edit2:奇怪的是当我在2个不同进程的for循环(10000)中使用这种方法时,我得到“事务(进程ID 55)在锁资源上与另一个进程死锁,并被选为死锁牺牲品。重新运行事务“。 。 这是正确的行为吗? Edit3 :(回答Edit2)我正在使用IDENT_CURRENT(‘XTable’) ,这是错误的来源。 在我回到SCOPE_IDENTITY() ,一切都已经解决了。

“TransactionInDoubtException”exception导致我的事务的完整性丢失

我有一个代码尝试插入作用于MSDTC事务的条目,如果有插入失败,则重试插入到特定阈值。 这是代码: while(!SaveToDb){ ……. Thread.Sleep(TimeSpan.FromMinutes(AppConfiguration.RetryInsertionDuringFailureIntervalInMin)); } private bool SaveToDb() { try { …… using (var scope = new TransactionScope(TransactionScopeOption.Required, option)) { Context.SaveEmail(_emailInfoList); Context.SaveSyncState(syncState); scope.Complete(); return true; } } catch (Exception ex) { …….. return false; } } 并且遇到了这个exception: 消息:该交易存在疑问。 堆栈跟踪:System.Transactions.TransactionStatePromotedIndoubt.PromotedTransactionOutcome(InternalTransaction tx),位于System.Transactions.CommittableTransaction.Commit(),位于System.Transactions.TransactionScope.InternalDispose(),位于System.Transactions.TransactionScope.Dispose(),位于Presensoft.Exchange2010Puch。 Core.PushJob.SaveEmailAndSyncState()InnerException:System.Data.SqlClient.SqlException(0x80131904):超时已过期。 操作完成之前经过的超时时间或服务器没有响应。 —> System.ComponentModel.Win32Exception(0x80004005):在System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning的System.Data.SqlClient.SqlInternalConnection.OnError(SqlExceptionexception,布尔breakConnection,Action`1 wrapCloseInAction)中等待操作超时(TdsParserStateObject stat eObj,Boolean callerHasConnectionLock,Boolean asyncClose)System.Data.SqlClient.TdsParserStateObject.ReadSniSyncOverAsync()上的System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj,UInt32错误) 在System.Data.SqlClient.TdsParserStateObject.TryReadNetworkPacket() 在System.Data.SqlClient.TdsParserStateObject.TryPrepareBuffer()at System.Data.SqlClient.TdsParserStateObject.TryReadByte(Byte&value) 在System.Data.SqlClient.TdsParser.TryRun(RunBehavior […]

C#ASP.Net:在长数据库操作期间出现exception(仅限某些时间)

我们有一个ASP.Net Web应用程序,它使用WCF连接到其业务层。 有时候,我在进行大规模操作时会遇到exception。 有趣的是,当我第一次运行它成功的时候。 之后它会抛出exception。 例外:套接字连接已中止。 操作是它将zipcodes从csv文件上载到数据库表中。 首先,我们从csv文件中读取并创建一个冗长的zipcodes字符串。 这将传递给存储过程并执行数据库操作。 注1 :)当我放置断点并进行测试时,很明显字符串的创建(在从csv获取数据并附加之后)非常快(不到一分钟)。 注2 :)我删除了事务(来自C#代码)并进行了测试,即使那时exception就在那里。 注3 🙂 csv中有一万卢比(十万)记录。 每行有四列(ZipCode,City,County,State)。 csv文件的大小是3MB。 我对事务日志大小有疑问。 然后我使用以下命令收缩日志文件。 DBCC SHRINKFILE(’MyDB_log’,1)GO 然后我使用SELECT [Size],Max_Size,Data_Space_Id,[File_Id],Type_Desc,[Name] FROM FRAMIS_R2075.sys.database_files WHERE data_space_id = 0检查日志大小 大小是128; 最大尺寸为268435456; Type_Desc =“LOG” 即使在缩小之后,exception仍在继续。 框架:.Net 3.0 DB:SQL Server 2005 好吧,当我等待20多分钟时,业务层似乎也有一个消息。 它说,“在调用阅读器时调用Read的无效尝试”。 通过这看,我删除了DbDataReader并使用SqlCommand来更新数据库表。 再次,在业务层出现exception,大约20分钟后说“超时exception”。 知道为什么会这样吗? private void ProcessDatabaseOperationsForZipCode(StringBuilder dataStringToProcess, int UserID) { int CountOfUnchangedZipCode = […]

在重用SqlCommand和转换时,我应该调用Parameters.Clear吗?

我在ADO.NET中手动编写事务。 我正在使用的示例重用了SqlCommand ,这似乎是个好主意。 但是,我在命令中添加了参数。 我的问题是:在下面的代码中, command.Parameters.Clear()是否正确? 或者我做错了吗? using (var connection = new SqlConnection(EomAppCommon.EomAppSettings.ConnStr)) { connection.Open(); SqlTransaction transaction = connection.BeginTransaction(); SqlCommand command = connection.CreateCommand(); command.Transaction = transaction; try { foreach (var itemIDs in this.SelectedItemIds) { command.CommandText = “UPDATE Item SET payment_method_id = @batchID WHERE id in (@itemIDs)”; // IS THE FOLLOWING CORRECT? command.Parameters.Clear(); command.Parameters.Add(new SqlParameter(“@batchID”, batchID)); […]

如何在C#中打开Windows 7事务处理文件

据我所知,Windows 7支持事务处理文件。 我如何在C#中使用它们?

TransactionScope和Transactions

在我的C#代码中,我使用TransactionScope,因为我被告知不要依赖我的sql程序员将始终使用事务,我们负责和yada yada。 话说回来 它看起来像TransactionScope对象在SqlTransaction之前回滚? 这是可能的,如果是这样,在事务中包装TransactionScope的正确方法是什么。 这是sql测试 CREATE PROC ThrowError AS BEGIN TRANSACTION –SqlTransaction SELECT 1/0 IF @@ERROR 0 BEGIN ROLLBACK TRANSACTION –SqlTransaction RETURN -1 END ELSE BEGIN COMMIT TRANSACTION –SqlTransaction RETURN 0 END go DECLARE @RESULT INT EXEC @RESULT = ThrowError SELECT @RESULT 如果我运行这个,我得到除以0并返回-1 从C#代码调用我得到一个额外的错误消息 遇到零除错误。 EXECUTE之后的事务计数表示缺少COMMIT或ROLLBACK TRANSACTION tatement。 先前的计数= 1,当前计数= 0。 如果我给sql事务一个名字然后 无法回滚SqlTransaction。 未找到该名称的任何事务或保存点。 […]

事务范围超时10分钟

我在C#中运行了一个长期的TransactionScope 。 我告诉范围它应该有很长的时间跨度,但我仍然会超时。 什么可能导致这个? TransactionOptions transactionOptions = new TransactionOptions(); transactionOptions.IsolationLevel = IsolationLevel.ReadCommitted; transactionOptions.Timeout = TimeSpan.MaxValue; using (var ts = new TransactionScope(TransactionScopeOption.Required, transactionOptions)) { DoLongCode(); }