Tag: 事务

SqlConnection如何管理IsolationLevel?

这篇MSDN文章指出: 隔离级别具有连接范围范围,并且一旦设置为与SET TRANSACTION ISOLATION LEVEL语句的连接,它将保持有效,直到连接关闭或设置了另一个隔离级别。 关闭连接并返回到池时,将保留最后一个SET TRANSACTION ISOLATION LEVEL语句的隔离级别。 重新使用池连接的后续连接使用在连接池时生效的隔离级别。 SqlConnection类没有可以保持隔离级别的成员。 那么连接如何知道在哪个隔离级别运行? 我问这个的原因是因为以下情况: 我在Serializable模式下使用TransactionScope打开了一个事务,比如“T1”。 打开T1的连接。 T1完成/处理,连接返回连接池。 在同一连接上调用另一个查询(从连接池获取后),此查询以可序列化模式运行! 问题: 汇集连接如何知道与之相关的隔离级别? 如何将其还原回其他一些事务级别??? 解析度: 池化连接返回可序列化隔离级别的原因是由于以下原因: 你有一个连接池(让我们说CP1) CP1可能有50个连接。 从CP1中选择一个连接C1并使用Serializable执行它。 此连接现在已设置其隔离级别。 无论您做什么,都不会重置(除非此连接用于执行不同隔离级别的代码)。 执行查询后,C1(Serializable)返回CP1。 如果再次执行步骤1-4,则使用的连接可能是除C1之外的其他连接,假设为C2或C3。 因此,它的隔离级别也将设置为Serializable。 因此,慢慢地,Serialzable在CP1中设置为多个连接。 当您执行未进行显式隔离级别设置的查询时,从CP1选择的连接将决定隔离级别。 例如,如果此类查询请求连接并且CP1使用C1(Serializable)执行此查询,则此查询将在Serializable模式下执行,即使您未明确设置它。 希望能够澄清一些疑惑。 🙂

无间隙序列,其中涉及具有多个表的多个事务

我(根据法律)要求在不同的表格上使用无间隙数字。 ID可以包含空洞但不包含序列。 这是我必须在C#代码或数据库(Postgres,MS SQL和Oracle)中解决的问题。 这是我的问题: Start transaction 1 Start transaction 2 Insert row on table “Portfolio” in transaction 1 Get next number in sequence for column Portfolio_Sequence (1) Insert row on table “Document” in transaction 1 Get next number in sequence for column Document_Sequence (1) Insert row on table “Portfolio” in transaction 2 Get next […]

在oracle中使用“嵌套”事务

我在Oracle中遇到了麻烦。 我有一些这样的程序: create or replace procedure myschema.DataSave(v_value IN NUMBER) as begin SET TRANSACTION ISOLATION LEVEL READ COMMITTED; begin insert/update/delete… exception when OTHERS then goto error; end; COMMIT; return; <> ROLLBACK; return; end; / 我以这种forms从c#项目调用此过程: … string conn_str = “…”; OracleConnection con = new OracleConnection(conn_str); con.Open(); OracleCommand cmd = new OracleCommand(“”, con); try { cmd.Transaction = […]

即使未调用System.Transactions.TransactionScope.Commit(),也会提交数据

在什么情况下,包含在System.Transactions.TransactionScope代码仍然可以提交,即使抛出exception并且最外层的范围从未调用过提交? using (var tx = new TransactionScope())包含一个顶级方法,并以相同的方式调用也使用TransactionScope的方法。 我正在使用带有关联tableadapters的类型化数据集。 可能是因为某些原因,适配器中的命令没有出现? 你们中的任何人都知道如何检查他们是否参加了环境的TransactionScope吗?

为什么TransactionScope不能与Entity Framework一起使用?

请参阅下面的代码。 如果我初始化多个实体上下文,那么我只在第二组代码上得到以下exception。 如果我注释掉第二组就行了。 {“底层提供商在Open上失败。”} 内部:{“与底层事务管理器的通信失败。”} 内部:{“错误HRESULT E_FAIL已从调用COM组件返回。”} 请注意,这是一个示例应用程序,我知道连续创建2个上下文没有意义。 但是,生产代码确实有理由在同一个TransactionScope创建多个上下文,并且无法更改。 编辑 这是我之前尝试设置MS-DTC的问题。 似乎在服务器和客户端上都启用了它。 我不确定它是否设置正确。 另请注意,我尝试这样做的原因之一是TransactionScope中的现有代码使用ADO.NET和Linq 2 Sql …我希望那些也使用相同的事务。 (这可能听起来很疯狂,但如果可能,我需要让它工作)。 如何在C#中使用TransactionScope? 解 Windows防火墙阻止了与MS-DTC的连接。 using(TransactionScope ts = new System.Transactions.TransactionScope()) { using (DatabaseEntityModel o = new DatabaseEntityModel()) { var v = (from s in o.Advertiser select s).First(); v.AcceptableLength = 1; o.SaveChanges(); } //-> By commenting out this section, it […]

如果禁用MSDTC,如何绕过TransactionScope内的多个数据库连接?

我有一个Web应用程序,它向DAL中的3个数据库发出请求。 我正在编写一些集成测试,以确保整个function往返实际上完成了我期望它做的事情。 这与我的unit testing完全分开,只是fyi。 我打算写这些测试的方式是这样的 [Test] public void WorkflowExampleTest() { (using var transaction = new TransactionScope()) { Presenter.ProcessWorkflow(); } } 在这种情况下,Presenter已经建立。 问题在ProcessWorkflow方法中发挥作用,因为它调用各种存储库,而这些存储库又访问不同的数据库,而我的sql server框没有启用MSDTC,所以每当我尝试创建新的sql连接时,我都会收到错误,或者尝试更改缓存连接的数据库以定位另一个数据库。 为简洁起见,Presenter类似于: public void ProcessWorkflow() { LogRepository.LogSomethingInLogDatabase(); var l_results = ProcessRepository.DoSomeWorkOnProcessDatabase(); ResultsRepository.IssueResultstoResultsDatabase(l_results); } 我已经尝试了很多东西来解决这个问题。 始终缓存一个活动连接并更改目标数据库 为每个目标数据库缓存一个活动连接(这有点无用,因为池应该为我做这个,但我想看看我是否得到了不同的结果) 在每个存储库中添加其他TransactionScope,以便使用TransactionScopeOption“RequiresNew”拥有自己的事务 我在列表上的第三次尝试看起来像这样: public void LogSomethingInLogDatabase() { using (var transaction = new TransactionScope(TransactionScopeOption.RequiresNew)) { //do some database work […]

会计数据库 – 存储信用卡和借记卡?

将事务存储到数据库中时 1)您是否将信用卡和借记卡存储在两个不同列下的同一记录中? (没有正号或负号) 例1A TABLENAME … … (Credit) null (Debit) 100 例1B TABLENAME … … (Credit) 250 (Debit) null 要么 2)您存储1个信用积分值和借记负号吗? 例2A TABLENAME … … (Amount) -100 实施例2B TABLENAME … … (Amount) 250

C# – System.Transactions.TransactionScope

我对TransactionScope类感到好奇。 在大多数情况下,我认为它是用于数据库连接(这是我用过的)。 我的问题是,您是否可以将任何代码放在TransactionScope的使用块中以使其成为事务性的? MS文档不清楚。 如果它可以用于制作除数据库连接之外的代码事务,那么支持哪些代码呢? 如果它可以使System.IO.File操作事务性,那对我来说似乎很疯狂。

TransactionScope与C#中的文件

我一直在使用TransactionScope来处理数据库,感觉还不错。 我正在寻找的是以下内容: using(var scope=new TransactionScope()) { // Do something with a few files… scope.Complete(); } 但显然这不起作用 – 如果有20个文件,并且第9个文件发生exception,所有之前的8个仍然保持更改而其余的保持不变 – 不执行回滚。 那么,为文件实现类似范围的行为的最佳方法是什么? 我希望有一个简单的答案,但如果没有,你能给我一些指示,或者指点我的相关文章吗?

如何在C#中使用TransactionScope?

我正在尝试使用TransactionScope ,但继续获得以下exception。 如果重要的话,该应用程序在与数据库不同的机器上运行。 我正在使用SQL Server 2005。 已禁用分布式事务管理器(MSDTC)的网络访问。 请使用组件服务管理工具在MSDTC的安全配置中启用DTC以进行网络访问。 using (TransactionScope tsTransScope = new TransactionScope()) { //Do stuff here tsTransScope.Complete(); } 编辑 我根据反馈做了一些改变。 现在我收到这个错误: “错误HRESULT E_FAIL已从调用COM组件返回。” “与基础交易经理的沟通失败了。” 解决方案我认为接受的答案解决了我遇到的最初问题。 第二个错误似乎特定于Entity Framework。 我会发布另一个问题。 以下是客户端上的属性: 客户http://sofzh.miximages.com/c%23/client.jpg 以下是服务器上的属性: 服务器http://sofzh.miximages.com/c%23/server.jpg