交易最佳实践

时间:2008-09-02 13:59:39

标签: database architecture transactions

您依赖数据库交易多少钱?

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

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

嵌套交易怎么样?

您是否有与交易相关的提示和技巧?

您遇到过与交易有关的任何问题吗?

欢迎各种答案。

8 个答案:

答案 0 :(得分:18)

我总是在一个using语句中包装一个事务。

using(IDbTransaction transaction )
{
// logic goes here.
   transaction.Commit();
}

一旦交易超出范围,它就会被处置掉。如果事务仍处于活动状态,则会回滚该事务。此行为失败 - 保护您不会意外地锁定数据库。即使抛出未处理的异常,事务仍将回滚。

在我的代码中,我实际上省略了显式回滚,并依赖using语句为我做的工作。我只是显式执行提交。

我发现这种模式大大减少了记录锁定问题。

答案 1 :(得分:8)

就个人而言,开发一个基于高流量性能的网站,我尽可能远离数据库事务。显然它们是必要的,所以我使用ORM和页面级对象变量来最小化我必须进行的服务器端调用的数量。

嵌套事务是最小化调用的一种很棒的方法,只要它们是不会导致锁定的快速查询,我就可以随时指向这个方向。在这些情况下,NHibernate一直是救世主。

答案 2 :(得分:3)

我对数据库的每次写操作都使用事务 因此,在较大的事务中包含了相当多的小“事务”,并且嵌套代码中基本上存在未完成的事务计数。如果在结束父母时有任何未完成的孩子,则全部回滚。

我更喜欢可用的客户端事务处理。如果你被降级为sps或其他服务器端逻辑工作单元,服务器端事务就可以了。

答案 3 :(得分:2)

哇!很多问题!

直到一年前,我100%依赖交易。现在只有98%。在高流量网站的特殊情况下(如Sara所述)以及高分区数据,强制执行分布式事务的需要,可以采用无事务架构。现在,您必须在应用程序中编写参照完整性代码。

此外,我喜欢使用注释(我是一个Java人)和方面以声明方式管理事务。这是确定事务边界的一种非常简洁的方法,它包括事务传播功能。

答案 4 :(得分:2)

就像一个FYI ......嵌套交易可能很危险。它只会增加陷入僵局的可能性。因此,虽然它是好的和必要的,但它的实施方式在更高的数量情况下很重要。

答案 5 :(得分:2)

服务器端事务,每秒35,000个事务,SQL Server:10 lessons from 35K tps

我们只使用服务器端交易:

  • 可以稍后开始并提前完成
  • 未分发
  • 可以在
  • 之前和之后完成工作
  • SET XACT_ABORT ON表示错误时立即回滚
  • 客户端/操作系统/驱动程序不可知

其他:

  • 我们嵌套呼叫,但使用@@ TRANCOUNT来检测已启动的TXN
  • 每个数据库调用始终是原子的

我们每天处理数百万个INSERT行(一些通过临时表进行批处理),完整的OLTP,没有问题。但不是35k tps。

答案 6 :(得分:0)

答案 7 :(得分:0)

正如Sara Chipps所说,交易对于高流量应用来说是过度的。所以我们应该尽可能地避免它。换句话说,我们使用BASE architecture而不是ACID。易趣是一个典型的案例。 Ebay架构中根本不使用分布式事务。但是对于eventual consistency,你必须自己做一些技巧。