【发布时间】:2013-05-29 23:46:22
【问题描述】:
虽然我的假设似乎听起来很主观,但经过一些研究,我发现找到喜欢虚拟 Try/Catch 而不是使用 Using statement 进行 IDbConnection/IDbTransaction 处理的开发人员并不少见(关闭/提交/回滚)。
即使是一些经验最丰富的开发人员和一些新开发人员也是如此。我故意不以 StackOverflow 或论坛链接上的任何问题为例,这样人们就不会生气。从what I found,Using 声明是safe to use(没有双关语)。
这有什么问题吗?考虑以下代码:
Public Sub Commit()
Dim cn As IDbConnection = {CREATE_CONNECTION}
Dim tran As IDbTransaction = Nothing
cn.Open()
Try
tran = cn.BeginTransaction
'run some queries here
tran.Commit()
Catch ex As Exception
If Not tran Is Nothing Then tran.Rollback()
Throw
Finally
cn.Close()
End Try
End Function
假设{CREATE_CONNECTION} 是Sub 的占位符,它根据数据库供应商创建连接,根据所有可能的最佳实践编写,不需要更多改进。
上面的代码不能这样改写有什么原因吗:
Using cn As IDbConnection = {CREATE_CONNECTION}
cn.Open()
Using tran As IDbTransaction = cn.BeginTransaction
'run some queries here
tran.Commit()
End Using
End Using
?
显然,第 2 版对其所做的工作更加直观。但也许我在这里遗漏了一些重要的东西?诸如数据访问库的特定于供应商的实现之类的东西在内部不调用Transaction.Commit 和/或Connection.Close 上的Dispose?这种方法是否会在不久的将来退役,或者在现代编程模式/最佳实践中还不够清晰?单声道/移动应用开发工具缺乏对 Using 关键字的调试支持?
我正在寻找任何形式的答案来支持或否认这一点。最好是引用原始文档的那个,比如Do not use Using with IDbTransaction when ...。博客链接或个人经历也可以。
【问题讨论】:
标签: c# vb.net transactions database-connection using-statement