我环顾四周,但找不到合适的(或对我来说满意的)如何解决我们遇到的问题。Dapper + Oracle + TransactionScope =交易已中止
我使用Dapper和ODP.NET 12托管驱动程序。当不使用TransactionScope时,不会遇到问题。
在事务范围下执行命令时,通过引发的TransactionAbortedException,我得到一个错误“Transaction has aborted”。
观察到的行为:当且仅当交易完成
1)TransactionAbortedException被抛出并且TransactionScope的设置。抛出异常时的时间点是在处理期间。
2)尽管有例外,交易概念实际上起作用!在完成()被调用后,更改被提交到数据库中。
下面是代码片段。
// Conn string: "Data Source=OraDB;Persist Security Info=True;User ID=userxxx;Password=passwordxxx;" providerName="Oracle.ManagedDataAccess.Client
// Note: GetDbFactory().Create() returns a DbConnection object
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew, new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted }))
using (var dbConn = GetDbFactory().Create())
{
foreach (MyDTO dto in dtoList)
{
var tableDAO= new TableDAO(dbConn);
MyEntity entity = new MyEntity()
{
Field1 = dto.Field1,
Field2 = dto.Field2
};
tableDAO.AddOrUpdate(entity);
}
// Commit changes
scope.Complete();
}
// This method is under the DAO class
public void AddOrUpdate(MyEntity entity)
{
// Verify arguments
entity.AsArgumentThrowExceptionIfNull("entity");
// build param
OracleDynamicParameters parameters = new OracleDynamicParameters();
parameters.Add("P_FIELD1", entity.Field1);
parameters.Add("P_FIELD2", entity.Field2);
// execute SP
dbConnection.Execute("PRC_MY_ENTITY_ADDORUPDATE", parameters, commandType: CommandType.StoredProcedure);
}//-- end AddOrUpdate()
=========================================== =======================
UPDATE(09-Apr-15)
我改变了我的方法,现在使用以下模式甲骨文。我们的代码处理Oracle和SQL Server中的连接,因此我更希望编码模式一致,但在使用Oracle + TransactionScope找到解决方案之前,我们将使用以下模式执行Oracle命令:
using (var dbConnection = dbConnFactory.Create())
{
// Open db connection
dbConnection.Open();
using (var trans = dbConnection.BeginTransaction())
{
bool isSuccess = false;
try
{
// Perform DB operations here
trans.Commit();
isSuccess = true;
}
finally
{
if(!isSuccess) trans.Rollback();
}
}
}
感谢您的建议和分享该文档片段。将范围移近dbConn范围之外并没有解决问题。 – Migg