我在ASP.NET / SQL Server 2005中使用SubSonic进行多删除事务时遇到了一些麻烦。它似乎总是在数据库中进行更改,即使没有调用完整的方法也是如此。 transactionscope对象?
我一直在阅读关于此的帖子,并尝试了各种替代方案(切换我的使用语句的顺序),使用DTC,不使用DTC等,但到目前为止没有喜悦。
我将假设这是我的代码问题,但我无法发现问题 - 是否有人能够提供帮助?我正在使用SubSonic 2.2。代码示例如下:
using (TransactionScope ts = new TransactionScope())
{
using (SharedDbConnectionScope sts = new SharedDbConnectionScope())
{
foreach (RelatedAsset raAsset in relAssets)
{
// grab the asset id:
Guid assetId = new Select(RelatedAssetLink.AssetIdColumn)
.From<RelatedAssetLink>()
.Where(RelatedAssetLink.RelatedAssetIdColumn).IsEqualTo(raAsset.RelatedAssetId).ExecuteScalar<Guid>();
// step 1 - delete the related asset:
new Delete().From<RelatedAsset>().Where(RelatedAsset.RelatedAssetIdColumn).IsEqualTo(raAsset.RelatedAssetId).Execute();
// more deletion steps...
}
// complete the transaction:
ts.Complete();
}
}
答案 0 :(得分:1)
你的using语句的顺序是正确的(我记得这个技巧的顺序:连接需要在创建时了解事务,并通过检查`System.Transactions.Transaction.Current来实现)。
一个提示:您不需要使用双括号。而且您不需要引用SharedDbConnectionScope()。 这看起来更具可读性。
using (var ts = new TransactionScope())
using (new SharedDbConnectionScope())
{
// some db stuff
ts.Complete();
}
无论如何,我没有看到,为什么这不起作用。 如果问题与MSDTC有关,则会发生异常。
我只能想象,SqlServer 2005配置中存在问题,但我不是SqlServer专家。
也许您应该尝试一些演示代码来验证交易是否有效:
using (var conn = new SqlConnection("your connection String");
{
conn.Open();
var tx = conn.BeginTransaction();
using (var cmd = new SqlCommand(conn)
cmd.ExecuteScalar("DELETE FROM table WHERE id = 1");
using (var cmd2 = new SqlCommand(conn)
cmd2.ExecuteScalar("DELETE FROM table WHERE id = 2");
tx.Commit();
}
亚音速支持本机事务而不使用TransactionScope:http://subsonicproject.com/docs/BatchQuery