2014-06-10 115 views
1

如何编写和运行自动化测试来检查我的数据库事务策略是否消除竞争条件?目前我所做的只是在开发中通过在代码中放置一个断点并发送两个请求来进行测试,然后我可以用慢镜头看到会发生什么。这不是我可以自动化的东西,它甚至不是真正的测试,只是开发的一部分。测试数据库事务

回答

1

您的测试可以产生线程并运行两个或多个线程,使相同的请求被事务隔离。

+0

但在这种情况下,如何强制第一个线程花费更长时间,以便第二个线程在事务过程中尝试更新? – shmish111

+1

在第一个请求中发送足够的数据以确保更新需要更长的时间。第二个请求应该只有一小部分数据。 –

+0

我喜欢这种提供有效载荷的想法,我们知道需要更长的时间。不幸的是,我不这么认为。 – shmish111

1

用真实的工作负载进行负载测试。不幸的是,这并不容易。在任何平台上很难发现种族条件。我知道没有系统的方法来找到这样的错误。

有时您可以排除构建不一致的可能性。例如:

  • SERIALIZABLE下运行的事务表现得好像它是系统中唯一的事务。因此,从来没有数据竞赛。
  • SNAPSHOT下的只读事务的行为方式相同。总体数据一致性。
  • A UNIQUE INDEX永远不会违反其完整性保证。

正如你可以看到你有时会令你的代码安全施工,以便有最小的必要测试。

+0

我的意思是我尝试这样做,但是如果有人出于某种原因剥离了我的事务管理或以某种方式绕过/破坏了它,那么直到产品崩溃才会被发现。这是我想测试但看起来不能,我想唯一的解决方案是负载测试。 – shmish111

+0

对。这个答案描述了我所做的事情(而且我*必须处理系统中的并发)。您可以像“SELECT @@ TRANCOUNT,ISOLATION_LEVEL”一样向您的代码添加断言,并在运行时声明您在正确的设置下被调用。我使用这种技术来查找不可重现的产品bug。原来99%的代码路径很好,但是在1%的事务错误配置的情况下。 – usr

+0

我非常喜欢“正确的构造”代码模式。例如,所有只读trans我做SNAPSHOT。所有低容量的反编译我都可以序列化。只读插入在READ COMMITTED中总是安全的。现在我可能已经用很少的努力和高信心使得90%的代码安全。 – usr