我写了一个存储过程,里面用了事务,我在数据库中执行该存储过程或者自己用ADO.NET调用该存储过程,事务的隔离级别都是READ COMMITTED,但是用NbearLite调用的话事务级别变为SERIALIZABLE。调用方法如下:
NBearLite.StoredProcedureSection spSection = db.StoredProcedure("spXXXX");
System.Collections.Generic.Dictionary outValues;
spSection.SetReturnParameter("RETURN_VALUE", System.Data.DbType.Int32, 0);
spSection.AddInputParameter("ID", System.Data.DbType.AnsiString, EnterpriseID);
spSection.AddInputParameter("Frist", System.Data.DbType.Currency, Frist);
spSection.AddInputParameter("Second", System.Data.DbType.Currency, Second);
spSection.AddInputParameter("WorkerID", System.Data.DbType.AnsiString, WorkerID);
System.Data.DataSet ds = spSection.ToDataSet(out outValues);
我跟踪代码的执行,没有用事务,郁闷!请问怎么回事??
听说博客园的开发也用了NbearLite,还请各位指点一二
我们现在主要用Entity Framework与ADO.NET。
建议用ADO.NET改写一下,比如上面的代码可以这样改写:
using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["DB"].ConnectionString)) { using (var command = conn.CreateCommand()) { command.CommandType = CommandType.StoredProcedure; command.CommandText = "spXXXX"; command.Parameters.AddWithValue("@RETURN_VALUE", 0); command.Parameters.AddWithValue("@ID", EnterpriseID); command.Parameters.AddWithValue("@Frist", Frist); command.Parameters.AddWithValue("@Second", Second); command.Parameters.AddWithValue("@WorkerID", WorkerID); conn.Open(); var ds = new DataSet(); new SqlDataAdapter(command).Fill(ds); } }
用ADO.net的话,我试过,的确没有问题。
但是这个问题是线上项目中发现的,如果要改成ADO.net的话,修改代价太大。
现在弄不明白NbearLite是怎么把事务隔离级别给提高成可序列化级的
@叶开1983: 那只能去看NBearLite的源代码了