我環顧四周,但找不到合適的(或對我來說滿意的)如何解決我們遇到的問題。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