qq_17031883 2024-11-18 15:33 采纳率: 36.4%
浏览 41
已结题

前台多人编辑时怎么让每个人保存刷新都互不干扰

前台多人编辑时怎么让每个人保存刷新都互不干扰,当同时编辑保存时,有时保存数据会串,还有刷新数据也是,
估计 和 ‘modGlobal.consult_pet_no = sPetNo’中途被赋其他值有关,请问有什么好的解决办法?比如第4张图,同时调用btnsave_click,通过 petNo
实例化一个Consultation,但是有时保存数据会串

img

img

img

img

  • 写回答

36条回答 默认 最新

  • M_try的小尾巴 2024-11-25 15:21
    关注

    提示: 本回答参考 AIGC,由本人审核整理提供。若问题解决,望采纳;如仍有疑问,请评论回复。

    问题分析

    在前台多人编辑场景中,确保每个用户的操作互不干扰是一个常见的技术挑战。具体到你的问题,主要涉及到以下几个方面:

    1. 数据串扰:多个用户同时编辑和保存数据时,可能会出现数据串扰的问题,即一个用户的操作影响了另一个用户的操作。
    2. 数据刷新:在多人编辑时,数据的刷新可能会导致数据不一致的问题。
    3. 全局变量问题modGlobal.consult_pet_no 这样的全局变量可能会在多个用户之间共享,导致数据串扰。

    解决方案

    为了解决这些问题,可以采取以下几种策略:

    1. 使用锁机制

    在处理并发操作时,可以使用锁机制来确保同一时间只有一个用户可以对某个资源进行操作。在你的代码中,可以使用 lock 关键字来实现这一点。

    public async Task<JsonResult> btnSave_Click(string ControlData, string sPetNo)
    {
        try
        {
            await Task.Run(() =>
            {
                lock (Consultation)
                {
                    modGlobal.consult_pet_no = sPetNo;
                    base.GetMechineSetting();
                    JArray datas = (JArray)JsonConvert.DeserializeObject(ControlData);
                    List<PageValueTransfer> datalist = JsonConvert.DeserializeObject<List<PageValueTransfer>>(ControlData);
                    var record = datalist.Where(n => n.id == "reg_id").First().value;
                    ConsultationService consultationService = Consultation;
                    try
                    {
                        // 处理保存逻辑
                        JsonResult jsonResult = Consultation.btnSave_Click();
                        Consultation.ReloadAfterSaveData();
                        // 其他逻辑
                    }
                    catch (Exception ex)
                    {
                        // 处理异常
                    }
                }
            });
        }
        catch (Exception ex)
        {
            // 处理异常
        }
        return jsonResult;
    }
    

    2. 使用会话或用户上下文

    为了避免全局变量的共享问题,可以使用会话或用户上下文来存储每个用户的特定数据。这样每个用户的操作都是独立的,不会互相干扰。

    public class UserContext
    {
        public string PetNo { get; set; }
        // 其他用户相关的属性
    }
    
    public class ConsultationController : Controller
    {
        private UserContext _userContext;
    
        public ConsultationController()
        {
            _userContext = new UserContext();
        }
    
        public async Task<JsonResult> btnSave_Click(string ControlData, string sPetNo)
        {
            try
            {
                _userContext.PetNo = sPetNo;
                // 其他逻辑
            }
            catch (Exception ex)
            {
                // 处理异常
            }
            return jsonResult;
        }
    }
    

    3. 使用数据库事务

    在保存数据时,可以使用数据库事务来确保数据的一致性。如果多个用户同时操作同一条数据,事务可以确保这些操作是原子性的,不会出现数据不一致的情况。

    public async Task<JsonResult> btnSave_Click(string ControlData, string sPetNo)
    {
        try
        {
            using (var transaction = _db.BeginTransaction())
            {
                try
                {
                    // 保存数据逻辑
                    transaction.Commit();
                }
                catch (Exception ex)
                {
                    transaction.Rollback();
                    // 处理异常
                }
            }
        }
        catch (Exception ex)
        {
            // 处理异常
        }
        return jsonResult;
    }
    

    4. 前端优化

    在前端,可以使用一些技术来减少数据串扰的可能性。例如,使用 WebSocket 或 SignalR 来实现实时数据同步,确保每个用户看到的数据是最新的。

    // 使用 SignalR 进行实时数据同步
    const connection = new signalR.HubConnectionBuilder()
        .withUrl("/consultationHub")
        .build();
    
    connection.on("ReceiveUpdate", function (data) {
        // 更新前端数据
    });
    
    connection.start().then(function () {
        // 连接成功后的逻辑
    }).catch(function (err) {
        return console.error(err.toString());
    });
    

    总结

    通过以上几种策略,可以有效解决前台多人编辑时数据串扰和刷新数据不一致的问题。具体选择哪种策略,可以根据你的应用场景和需求来决定。

    评论

报告相同问题?

问题事件

  • 系统已结题 11月26日
  • 修改了问题 11月18日
  • 创建了问题 11月18日