我想在业务层使用 TransactionScope 类来管理数据访问层中的数据库操作。
这是我的示例代码。当我执行它时,它会尝试启用dtc。我想在没有启用dtc的情况下进行操作。
我已经查看了https://entlib.codeplex.com/discussions/32592文章。它对我不起作用。我读了很多关于这个主题的文章,但没有一篇真正触及企业库,或者我没有看到。
顺便说一句,我可以使用dotnet sql客户端使用TransactionScope,效果很好。
SampleInsert()方法的内部是什么?
谢谢,
业务层方法:
public void SampleInsert()
{
using (TransactionScope scope = new TransactionScope())
{
Sample1DAL dal1 = new Sample1DAL(null);
Sample2DAL dal2 = new Sample2DAL(null);
Sample3DAL dal3 = new Sample3DAL(null);
dal1.SampleInsert();
dal2.SampleInsert();
dal3.SampleInsert();
scope.Complete();
}
}
数据访问层方法:
//sampleInsert method structurally same for each 3 dal
public void SampleInsert()
{
Database database = DatabaseFactory.CreateDatabase(Utility.DATABASE_INFO); ;
using (DbConnection conn = database.CreateConnection())
{
conn.Open();
DbCommand cmd = database.GetStoredProcCommand("P_TEST_INS", "some value3");
database.ExecuteNonQuery(cmd);
}
}
答案 0 :(得分:2)
嗨是的,这将启用dtc,因为您在一个TransactionScope中创建了3个DB连接。当在同一TransactionScope中创建多个数据库连接时,本地事务将升级到分布式事务,因此将启用dtc来管理Distributed Trnsactions.You必须以只为整个TransactionScope创建一个数据库连接的方式执行此操作。我希望这会给你一个想法。
答案 1 :(得分:0)
在研究和查询分析器之后,我更改了SampleInsert()体,如下所示,它工作正常。问题是 ethicallogics 提到每次访问数据库时都会打开新连接。
public void SampleInsert()
{
Database database = DatabaseFactory.CreateDatabase(Utility.DATABASE_INFO);
using (DbCommand cmd = database.GetStoredProcCommand("P_TEST_INS", "some value1"))
{
database.ExecuteNonQuery(cmd);
}
}