使用Dapper哪个交易更好:BEGIN TRAN或TransactionScope?

时间:2017-05-22 17:32:21

标签: c# tsql transactions dapper

我刚刚开始使用Dapper,我想知道哪些模式的交易会更好。

当我编写SQL时,我更喜欢使用脚本中的事务:

BEGIN TRAN

-- insert, update etc.

COMMIT

因为它更容易测试,但也有问题transaction with dapper dot net 使用.net事务,所以现在我不确定我应该使用哪一个。

两种方法都有不同的优势吗?

1 个答案:

答案 0 :(得分:6)

实际上,这与Dapper无关。请参阅this answer。

connection.BeginTransactionDBConnection或“存储过程中的事务”决策不在Dapper的范围内。 Dapper只是在ADO.NET的TransactionScope对象上公开了一些扩展方法,它们将查询的输出映射到对象。休息取决于你。

  1. connection.BeginTransaction通常用于分布式事务;跨越不同数据库的事务可能在不同的系统上。这需要在操作系统和SQL Server上进行一些配置,否则这将无法正常工作。如果您的所有查询都针对单个数据库实例,则不建议这样做 正如@ImrePühvel在评论中指出:对于单个数据库,当您需要在不受您控制的事务中包含代码时,这可能很有用。对于单个数据库,它也不需要特殊配置。

  2. connection.BeginTransaction是ADO.NET语法,用于针对单个数据库实现事务(在C#,VB.NET等中)。这不适用于多个数据库。

  3. “存储过程中的事务”是针对存储过程中的单个数据库实现的,而不是在应用程序代码中执行此操作。

  4. 嵌套交易或上述类型的组合是另一个讨论主题;试着在网上搜索。

    我个人的意见是使用UnitOfWork以更好的方式处理交易。我已经在上面的链接中提到了细节。它在内部使用class PostMetric(models.Model): likes = models.IntegerField() comments = models.IntegerField() created_at = models.DateTimeField(auto_now_add=True)