多线程 数据库操作 并发问题
private void StartAsyncTask(Object workItemState){
Thread oThread = new Thread(new ThreadStart(this.StartBuss));
oThread.Start();
}
private void StartBuss() {
log.Info(string.Format("Completion IsThreadPoolThread is {0}", Thread.CurrentThread.IsThreadPoolThread));
NameValueCollection coll = _context.Request.Form;
if (coll.Count == 0)
coll = _context.Request.QueryString;
string strResponse = string.Empty;
string strUserID = string.Empty;
List<string> batchid = new List<string>();
string tradeno = string.Empty;
//验证参数
CheckSign check = new CheckSign();
if (check.SignCheckAsy(coll, ref strResponse, ref strUserID))
{
//处理交易
strResponse = businessprocess.ProcessBusiness(coll, strUserID, ref batchid, ref tradeno);
}
log.Info(strResponse);
Encoding encode = Encoding.Default;
string charset = coll.Get("_input_charset");
if (!string.IsNullOrEmpty(charset))
encode = Encoding.GetEncoding(charset);
_context.Response.ContentEncoding = encode;
_context.Response.Write(strResponse);
_completed = true;
_callback(this);
}
public string ProcessBusiness(NameValueCollection coll, string strUserid, ref List<string> batchid, ref string tradeno)
{
string strResposne = string.Empty;
BusinessParam IParam = IModelFactory.CreateInterface(coll);
if (IParam != null)
{
//记录日志
log.Info(
string.Format("开始交易请求",
ObjectToString.Ots(IParam))
);
IParam.userid = strUserid;
IBusinessInterface IbusinessInterface = IFactory.IFactory.CreateInterface(IParam.service);
if (IbusinessInterface != null)
{
strResposne = IbusinessInterface.BussinessProcess(IParam, ref batchid, ref tradeno);
}
}
else
{
strResposne = EnumDescription.GetFieldText(ResultInfo.INFO.INVALID_SERVICE);
}
return strResposne;
}
/// <summary>
/// 创建流水单
/// </summary>
/// <param name="o">流水单实体</param>
/// <returns></returns>
public List<VirTrade> CreateTrade(List<VirTrade> VirTrade)
{
VirTrade o = null;
string sql_value = "";
List<SqlParameter> param = new List<SqlParameter>();
try
{
for (int i = 0; i < VirTrade.Count; i++)
{
o = VirTrade[i];
object SequenceLock = new object();
//这里用锁的机制,提高并发控制能力
lock (SequenceLock)
{
o.vBatchID = GetBatchID();
}
ILog log = new ILog(typeof(TradeDAL));
log.Info(o.vBatchID + "_ vCustomer:" + o.vCustomer + "_ vCost:" + o.vCost);
if (!string.IsNullOrEmpty(o.vBatchID))
{
if (string.IsNullOrEmpty(o.vTradeNo))
{
o.vTradeNo = o.vBatchID + DateTime.Now.Millisecond.ToString(); //不带交易号 则新增交易号
}
}
else
{
throw new Exception("创建订单号失败!");
}
sql_value += string.Format(SQL_CREATE_VIR_TRADE, "(@vBatchID" + i + ",@vOrderID" + i + ",@vCost" + i + ",@vCostC" + i + ",@vCostN" + i + ",@vCDate" + i + ",@vODate" + i + ",@vTradeType" + i + ",@vTradeChannel" + i + ",@vTradePaymethod" + i + ",@vTradeState" + i + ",@vTradeNo" + i + ",@vPartner" + i + ",@vCustomer" + i + ",@vSeller" + i + ",@vTargetCustomer" + i + ",@vTargetSeller" + i + ",@vBody" + i + ");", "(@vBatchID" + i + ",@vTradeDetail" + i + ");");
param.Add(new SqlParameter("@vTradeDetail" + i, o.vTradeDetail.ToString().Replace('|', ' ')));
param.Add(new SqlParameter("@vBatchID" + i, o.vBatchID.ToString()));
param.Add(new SqlParameter("@vOrderID" + i, o.vOrderID.ToString()));
param.Add(new SqlParameter("@vCost" + i, o.vCost.ToString()));
param.Add(new SqlParameter("@vCostC" + i, o.vCostC.ToString()));
param.Add(new SqlParameter("@vCostN" + i, o.vCostN.ToString()));
param.Add(new SqlParameter("@vCDate" + i, DateTime.Now.ToString()));
param.Add(new SqlParameter("@vODate" + i, DateTime.Now.ToString()));
param.Add(new SqlParameter("@vTradeType" + i, o.vTradeType.ToString()));
param.Add(new SqlParameter("@vTradeChannel" + i, o.vTradeChannel.ToString()));
param.Add(new SqlParameter("@vTradeState" + i, o.vTradeState.ToString()));
param.Add(new SqlParameter("@vTradeNo" + i, o.vTradeNo.ToString()));
param.Add(new SqlParameter("@vPartner" + i, o.vPartner.ToString()));
param.Add(new SqlParameter("@vCustomer" + i, o.vCustomer.ToString()));
param.Add(new SqlParameter("@vTradePaymethod" + i, o.vTradePaymethod.ToString()));
param.Add(new SqlParameter("@vSeller" + i, o.vSeller.ToString()));
param.Add(new SqlParameter("@vTargetCustomer" + i, o.vTargetCustomer.ToString()));
param.Add(new SqlParameter("@vTargetSeller" + i, o.vTargetSeller.ToString()));
param.Add(new SqlParameter("@vBody" + i, o.vBody.ToString()));
}
SqlHelper.ExecuteNonQuery(AppConfig.JinRiVirtualAccountConn, CommandType.Text, sql_value, param.ToArray());
return VirTrade;
}
catch (Exception ex)
{
throw ex;
}
}
并发状况下会出现 EX:System.InvalidOperationException: 此 SqlTransaction 已完成;它再也无法使用。
在 com.jinri.DAL.TradeDAL.CreateTrade(List`1 VirTrade) 位置 E:\code\VirtualAccount\VirtualAccount\com.jinri.DAL\TradeDAL\TradeDAL.cs:行号 135
在 com.jinri.BLL.TradeBLL.CreateTrade(List`1 VirTrade) 位置 E:\code\VirtualAccount\VirtualAccount\com.jinri.BLL\TradeBLL\TradeBLL.cs:行号 28 求解答 --------------------编程问答-------------------- 比如一个线程已经处理完事物,而另一个线程还要处理,那就出错了,所以你要做好同步,最起码你得加个lock吧 --------------------编程问答-------------------- object SequenceLock = new object();
//这里用锁的机制,提高并发控制能力
lock (SequenceLock)
{
o.vBatchID = GetBatchID();
}
在处理数据的时候加了 --------------------编程问答-------------------- object SequenceLock = new object();
//这里用锁的机制,提高并发控制能力
lock (SequenceLock)
{
o.vBatchID = GetBatchID();
}
看到楼主写的如上代码,你这样加锁是不起作用的,因为每次都是一个新的对象
楼主应对线程的共有资源加锁 --------------------编程问答-------------------- --------------------编程问答-------------------- 问题已解决 呵呵 之前用的是ThreadPool的关系 NEW THREAD 就行了
补充:.NET技术 , C#