问题标签 [transactions]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
9 回答
8258 浏览

database - 单元测试数据库

去年夏天,我正在开发一个基本的 ASP.NET/SQL Server CRUD 应用程序,单元测试是其中一项要求。当我尝试对数据库进行测试时遇到了一些麻烦。据我了解,单元测试应该是:

  • 无国籍
  • 彼此独立
  • 可重复使用相同的结果,即没有持续的变化

在为数据库开发时,这些要求似乎相互矛盾。例如,如果不确保要插入的行不存在,我就无法测试 Insert(),因此我需要先调用 Delete()。但是,如果他们不在那里呢?然后我需要先调用 Exists() 函数。

我的最终解决方案涉及非常大的设置功能(糟糕!)和一个空的测试用例,它将首先运行并表明设置运行没有问题。这是牺牲了测试的独立性,同时保持了它们的无国籍状态。

我发现的另一个解决方案是将函数调用包装在可以轻松回滚的事务中,例如Roy Osherove 的 XtUnit。这项工作,但它涉及另一个库,另一个依赖项,对于手头的问题,它似乎有点过于繁重。

那么,SO 社区在遇到这种情况时做了什么?


tgmdbm 说:

您通常使用您最喜欢的自动化单元测试框架来执行集成测试,这就是为什么有些人会感到困惑,但他们不遵循相同的规则。您可以参与许多类的具体实现(因为它们已经过单元测试)。您正在测试您的具体类如何相互交互以及如何与数据库交互

所以如果我没看错的话,真的没有办法有效地对数据访问层进行单元测试。或者,数据访问层的“单元测试”是否涉及测试,例如,由类生成的 SQL/命令,独立于与数据库的实际交互?

0 投票
2 回答
1396 浏览

.net - 是否可以在 .Net 应用程序和 COM+ 对象之间共享事务?

不久前我做了一些测试,但从未弄清楚如何进行这项工作。

这些成分:

  • COM+ 事务对象(用 VB6 开发)
  • IIS 中的 .Net Web 应用程序(带有事务)...
    调用 COM+ 组件
    更新 SQL 数据库中的一行

测试:

运行 .Net 应用程序并强制异常。

结果:

从 .Net 应用程序进行的更新会回滚。
COM+ 对象所做的更新不会回滚。

如果我从旧的 ASP 页面调用 COM+ 对象,则回滚工作。

我知道有些人可能在想“什么?!COM+ 和 .Net,你一定是疯了!”,但世界上有些地方仍然有很多 COM+ 组件。我只是好奇是否有人遇到过这个问题,以及你是否知道如何使这项工作。

0 投票
6 回答
1763 浏览

sharepoint - 事务设计模式

我需要使用不支持 COM+ 或 .NET 事务的外部 API 创建一个“事务”进程(确切地说是 Sharepoint)

我需要做的是能够按顺序执行多个进程,但是该序列中的任何失败都意味着我将不得不手动撤消前面的所有步骤。在我的情况下,只有 2 种类型的步骤,两者都相当容易撤消/回滚。

是否有人对可能对此有用的设计模式或结构有任何建议?

0 投票
8 回答
15086 浏览

database - 交易最佳实践

您对数据库事务的依赖程度如何?

您喜欢小交易范围还是大交易范围?

您是否更喜欢客户端事务处理(例如 .NET 中的 TransactionScope)而不是服务器端事务,反之亦然?

嵌套事务呢?

你有一些与交易有关的提示和技巧吗?

您在使用事务时遇到的任何问题?

欢迎各种答案。

0 投票
4 回答
23222 浏览

sql-server - SQL Server 批量插入是事务性的吗?

如果我在 SQL Server 2000 查询分析器中运行以下查询:

在符合 OurTable 架构的 40 行文本文件上,但随后更改了最后 20 行的格式(假设最后 20 行的字段较少),我收到一个错误。但是,前 40 行已提交到表中。我调用 Bulk Insert 的方式是否使它不是事务性的,或者我是否需要做一些明确的事情来强制它在失败时回滚?

0 投票
3 回答
1445 浏览

java - 在 C++ 和 Java 之间传播 Oracle 事务

我们有一个现有的 C++ 应用程序,我们将逐渐用一个新的基于 Java 的系统来替换它。在我们完全用 Java 重新实现所有东西之前,我们希望 C++ 和 Java 必须相互通信(RMI、SOAP、消息传递等——我们还没有决定)。

现在我的经理认为我们需要 Java 和 C++ 方参与同一个 Oracle DB 事务。这与通常的分布式事务问题有关,但不同于通常的分布式事务问题,即单个进程协调 2 个事务资源,例如数据库和消息队列。

从性能和稳定性的角度来看,我认为跨进程传播事务是一个糟糕的想法,但我仍然会被要求提供解决方案。

我熟悉 XA 事务并且我已经使用 JBoss 事务管理器完成了一些工作,但是我的谷歌搜索在 2 个进程之间传播 XA 事务并没有发现任何好的结果。

我们在 Java 端使用 Spring,他们的文档明确声明他们不提供任何事务传播帮助。

我们不打算使用传统的 Java EE 服务器(例如:IBM Websphere),它可能支持传播(不是我能找到任何权威文档)。

非常感谢任何有关解决方案的帮助或指示。

0 投票
4 回答
7152 浏览

sql - 如何在某些 SQL 行上运行进程时锁定它们?

VB.NET我的工作有一个用编写的财务应用程序,SQL多个用户可以同时处理该应用程序。

在某些时候,一个用户可能决定发布他们(可能还有其他人)当前正在处理的一批条目。

显然,在Post 过程启动,我不再希望任何其他用户在该批次中添加编辑删除条目。

我已经看到我可以通过在 Post 过程开始时打开 SQL 事务来锁定所有数据,但是该过程可能相当长,我不希望在完成该功能可能需要的几分钟内打开事务.

有没有办法只锁定我知道需要从 VB.NET 代码操作的记录?

0 投票
5 回答
28370 浏览

sql - 寻找 SQL 事务日志文件查看器

如果你们中的任何人使用过一个很酷的工具来查看/查询 SQL 事务日志,请告诉我。这应该显示所有已提交或回滚的事务性 sql 语句。

对于数据库文件,如果它具有一些额外的图形功能,例如显示索引的内部二叉树结构,那将是很棒的,但我想我要求太多了。

0 投票
1 回答
4378 浏览

transactions - 分布式事务如何工作(例如 MSDTC)?

我以一种模糊的方式了解常规 ACID 事务是如何工作的。您在数据库上执行一些工作,直到设置了某种提交标志才确认工作。提交部分基于一些基本假设(例如单个磁盘块写入是原子的)。如果发生灾难性错误,您可以在恢复阶段清除未提交的数据。

分布式事务如何工作?在我读过的一些 MS 文档中,您可以以某种方式跨数据库和文件系统(除其他外)执行事务。

这项技术可以(并且可能)用于安装程序,您希望程序完全安装或完全不存在。您只需在安装程序启动时开始事务。接下来,您可以连接到注册表和文件系统,进行定义安装的更改。工作完成后,只需提交,如果由于某种原因安装失败,则回滚。这个神奇的分布式事务协调器会自动为您清理注册表和文件系统。

两个不同的系统怎么可能以这种方式进行交易?在我看来,总是有可能使系统处于不一致的状态,即文件系统已提交其更改而注册表没有。我认为在 MSDTC 中甚至可以通过网络执行事务。

我已经阅读了http://blogs.msdn.com/florinlazar/archive/2004/03/04/84199.aspx,但感觉这只是解释的开始,应该大大扩展第 4 步。

编辑:根据我在http://en.wikipedia.org/wiki/Distributed_transaction上收集的信息,可以通过两阶段提交(http://en.wikipedia.org/wiki/Two-phase_commit)来完成。读完后,我仍然没有 100% 理解方法,步骤之间似乎有很大的错误空间。

0 投票
2 回答
2236 浏览

sql - 在一个事务中更新架构和行,SQL Server 2005

我目前正在更新一个遗留系统,该系统允许用户指定其中一个表的部分架构。用户可以通过此界面在表中创建和删除列。这个遗留系统使用 ADO 2.8,并使用 SQL Server 2005 作为其数据库(在尝试对这头野兽进行现代化改造之前,您甚至不想知道它使用的是什么数据库……但我离题了。=))

在同一编辑过程中,用户可以定义(和更改)可以存储在这些用户创建的字段中的有效值列表(如果用户想要限制字段中可以包含的内容)。

当用户更改字段的有效条目列表时,如果他们删除了其中一个有效值,则允许他们选择一个新的“有效值”来映射其中包含此(现在无效)值的任何行,以便它们现在再次具有有效值。

在查看旧代码时,我注意到它极易使系统进入无效状态,因为上述更改不是在事务中完成的(因此,如果其他人在上述过程的中途出现并进行了他们的自己的变化......好吧,你可以想象可能导致的问题)。

问题是,我一直试图让它们在单个事务下更新,但是每当代码到达它更改该表架构的部分时,所有其他更改(更新行中的值,无论是在架构更改与否的表......它们甚至可以是完全不相关的表)在事务中构成的那一点似乎被静默删除。我没有收到表明它们已被删除的错误消息,并且当我最后提交事务时没有引发错误......但是当我去查看应该在事务中更新的表时,只有新列在那里。所做的任何非架构更改都不会保存。

到目前为止,在网上寻找答案被证明是浪费几个小时......所以我转向这里寻求帮助。有没有人尝试过通过 ADO 执行事务,既更新表的架构又更新表中的行(无论是同一个表还是其他表)?不允许吗?是否有任何文档可以在这种情况下有所帮助?

编辑:

好的,我做了一个trace,这些命令被发送到数据库中(括号中的解释)

(我不知道这里发生了什么,看起来它正在创建一个临时存储过程......?)

(检索包含用户生成字段的定义信息的表)

(我认为我的代码在这里遍历它们的列表,获取当前信息)

(这似乎是我输入定义的修改数据的地方,我遍历每个并更新自定义字段本身的定义中发生的任何更改)

(这是我的代码在此保存开始之前通过界面删除删除的地方] ...据我所知,这也是在此事务期间实际发生的唯一事情)

(现在,如果任何定义被更改为需要更改用户创建的列的属性或需要添加/删除列上的索引,则在此处完成,并为任何行提供默认值给定列还没有值...请注意,据我所知,当存储过程完成时,实际上没有发生这种情况。)

p>

(关闭交易...?)

p>

经过上面的所有这些,只发生了该列的删除。事务中它之前和之后的所有内容似乎都被忽略了,并且 SQL 跟踪中没有消息表明事务期间出现了问题。