数据库事务插入一部分成功,一部分失败,求解 返回
SqlSugar
沟通中
7
350

悬赏:100 飞吻
首先是对接接收
public void StartConsuming() { _connection = rabbitMqFactory.CreateConnection(); _channel = _connection.CreateModel(); using (IConnection conn = rabbitMqFactory.CreateConnection()) { using (IModel channel = conn.CreateModel()) { channel.ExchangeDeclare(ExchangeName, "direct", durable: true, autoDelete: false, arguments: null); channel.QueueDeclare(QueueName, durable: true, autoDelete: false, exclusive: false, arguments: null); channel.QueueBind(QueueName, ExchangeName, routingKey: QueueName); var a = 0; // 声明交换机、队列和绑定(省略具体代码) var consumer = new EventingBasicConsumer(_channel); consumer.Received += (model, ea) => { // 处理消息(省略具体代码) var body = ea.Body.ToArray(); var message = Encoding.UTF8.GetString(body); //假设您从消息中解析出一个数值 var data = JsonConvert.DeserializeObject<GetPtlInfor>(message); //这里来调用方法 PtlServerController ptlServerController = new PtlServerController(); ptlServerController.MergeTaskInfor(data); //处理数值 _channel.BasicAck(ea.DeliveryTag, multiple: false); }; _channel.BasicConsume(queue: QueueName, noAck: false, consumer: consumer); }
然后demo部分 public class PtlServerController : Controller { public PtlServerController() { var ger = System.Configuration.ConfigurationManager.ConnectionStrings["Default"].ConnectionString; var _JCount = Convert.ToInt32(System.Configuration.ConfigurationManager.ConnectionStrings["JCount"].ConnectionString); JCount = _JCount; db = new SqlSugarClient(new ConnectionConfig() { ConnectionString = ger, // 替换为你的数据库连接字符串 DbType = DbType.SqlServer, // 根据你的数据库类型进行替换 IsAutoCloseConnection = true, InitKeyType = InitKeyType.Attribute, // 从特性读取主键和自增列信息 }); } //方法部分,这里是在控制器中的方法 [HttpPost] public ActionResult MergeTaskInfor(GetPtlInfor getPtlInfor) { try { db.Ado.BeginTran(); //添加合单后的主任务 db.Insertable(lineMainTask).AS(LineBodyRepositoryInfor.LineMergedTask).IgnoreColumns(it => new { it.Id, it.StatusDesc }).ExecuteCommand(); foreach (var item in list) { item.Status = 1; db.Updateable(item).AS(LineBodyRepositoryInfor.LineQuestTable).IgnoreColumns(it => new { it.Id, it.StatusDesc }).Where(C => C.Id == item.Id).ExecuteCommand(); db.Updateable(item).IgnoreColumns(it => new { it.Id, it.StatusDesc, it.SetPull }).Where(c => c.pullNo == item.pullNo).ExecuteCommand(); } db.Insertable(lineMainTaskInfors).AS(LineBodyRepositoryInfor.LineMainTaskInfor).IgnoreColumns(it => new { it.Id }).ExecuteCommand(); db.Insertable(mainTaskInfors).AS(LineBodyRepositoryInfor.LineQuest).IgnoreColumns(it => new { it.Id, it.StatusDesc }).ExecuteCommand(); var Gcount = 0; var GongInfor = 0; var date = DateTime.Now; //本在事务内,但出现事务提交成功,数据未保存,查询是 foreach (var item in gongInfor) { Quest quest = new Quest(); quest.MainTaskNumber = MainTaskName; quest.FormerlyDate = date; quest.WmarInfor = item.WorkshopName; quest.Status = 0; if (Gcount == 0) { quest.FormerlyWorkshopCode = "-1"; GongInfor = item.WorkshopSequence; } else { quest.FormerlyWorkshopCode = GongInfor.ToString(); } GongInfor = item.WorkshopSequence; //添加工段拣货信息 db.Insertable(quest).AS(item.WorkshopQuestTable).IgnoreColumns(it => new { it.Id, it.StatusDesc }).ExecuteCommand(); Gcount++; } db.Ado.CommitTran(); } catch (Exception ex) { db.Ado.RollbackTran(); foreach (var item in list) { TextLoggerInforGer.Append("出现异常合并子单号为:" + item.csnNo, "合并任务" + LineBodyRepositoryInfor.LineBodyName); item.Status = 0; db.Updateable(item).AS(LineBodyRepositoryInfor.LineQuestTable).IgnoreColumns(it => new { it.Id, it.StatusDesc }).Where(C => C.Id == item.Id).ExecuteCommand(); } TextLoggerInforGer.Append("合单出现异常,进行回滚,异常原因" + ex.Message + "," + ex.InnerException, "合并任务" + LineBodyRepositoryInfor.LineBodyName); return DataProcess.Failure("合单出现异常,进行回滚").ToMvcJson(); } //因为有出现过事务执行完成,但是提交数据丢失情况,做了一次查询,用作记录 foreach (var item in list) { item.Status = 1; db.Updateable(item).AS(LineBodyRepositoryInfor.LineQuestTable).IgnoreColumns(it => new { it.Id, it.StatusDesc }).Where(C => C.Id == item.Id).ExecuteCommand(); var ger = db.Queryable<Linepull>().AS(LineBodyRepositoryInfor.LineQuestTable).Where(c => c.Id == item.Id).First(); if (ger != null) { TextLoggerInforGer.Append("最终执行完查询状态为:" + ger.csnNo + "状态:" + ger.Status, "合并任务" + LineBodyRepositoryInfor.LineBodyName); } } } }
这是关乎操作数据库的
但是在最终执行下来出现了死锁,但是我发现他是执行完成的,重启服务后我去查数据库,下面这句在每个表中又插入成功了,这个是为什么,其他的表都没有数据
db.Insertable(quest).AS(item.WorkshopQuestTable).IgnoreColumns(it => new { it.Id, it.StatusDesc }).ExecuteCommand();
日志记录部分
请帮忙看下什么原因,也可以私聊看下,谢谢
热忱回答(7)
-
fate sta VIP0
2周前1、线程安全引的并发问题解决方案
var newdb=db.CopyNew();
try
{
newdb.Ado.BeginTran();
将try里面的所有db都换成newdb进行测试
2、如果是mysql保证表的引擎都是支持事务的。要一个一个确认
0 回复 -
辻弌 VIP0
2周前@fate sta:好的我试试,谢谢
0 回复 -
辻弌 VIP0
2周前@fate sta:我刚才看了下 db.不出来这个var newdb=db.CopyNew();
0 回复 -
辻弌 VIP0
2周前@fate sta:咳咳没事了版本太低
0 回复 -
辻弌 VIP0
2周前@fate sta:我发现我版本.net 4.5没办法使用高版本的sqlSugar,没办法使用这个方法,还有其他方法可以吗
0 回复 -
fate sta VIP0
2周前@辻弌:没办法用就手动new
var newdb=new sqlsugarclient(xxx)
0 回复 -
辻弌 VIP0
2周前@fate sta:好的谢谢
0 回复