You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Entity Framework SQLite保存购物车时出现并发错误求助

服务器购物车添加商品并发错误问题

我开发的服务器应用中,添加新用户的逻辑可以正常运行,但向购物车添加新商品时,所有操作都出现问题,保存更改时会触发并发错误。

正常工作的添加用户逻辑

public static async Task<bool> TryAddUserAsync(string name, string email, string password)
{
    using (var database = new Database())
    {
        try
        {
            var existingUser = await database.Users.FirstOrDefaultAsync(u => u.Email == email);
            if (existingUser != null)
            {
                Console.WriteLine("User with this email already exists.");
                return false;
            }

            var user = new User() { Email = email, Name = name, Password = password, Role = "Customer" };
            database.Users.Add(user);
            database.ShoppingCarts.Add(new ShoppingCart() { Id = user.Id, View = new List<MedicineShoppingCartView>() });
            await database.SaveChangesAsync();
            Console.WriteLine("SUCCESS SIGN UP");
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
            return false;
        }
        return true;
    }
}

无法正常工作的添加到购物车逻辑

public async static Task<bool> TryAddToCartAsync(int id, string key)
{
    try
    {
        using (var database = new Database())
        {
            // 开始事务
            using (var transaction = database.Database.BeginTransaction())
            {
                // 获取用户
                var user = await database.Users.FirstOrDefaultAsync(u => u.Email == key);

                if (user == null)
                    return false;

                
                var cart = await database.ShoppingCarts.Include(sc => sc.View)
                                        .Where(u => u.Id == user.Id)
                                        .FirstOrDefaultAsync();

                // 尝试从数据库获取商品
                var medicine = await GetByIdFromDatabaseAsync(id);
                if (medicine == null)
                    return false;

                // 在用户购物车中查找商品
                var existingItem = cart.View.FirstOrDefault(c => c.Id == id);
                if (existingItem != null)
                {
                    // 如果商品已存在,增加数量
                    existingItem.Count += 1;
                }
                else
                {
                    // 如果商品不存在,添加到购物车
                    cart.View.Add(new MedicineShoppingCartView() { Id = medicine.Id, Count = 1 });
                }

                // 保存数据库更改
                await database.SaveChangesAsync();

                // 提交事务
                transaction.Commit();

                return true; // 操作成功完成
            }
        }
    }
    catch (Exception ex)
    {
        // 错误处理
        Console.WriteLine(ex);
        return false;
    }
}

调用添加购物车函数的代码

private async Task AddToCartAsync(JsonElement jsonObject, NetworkStream stream)
{
    if (!jsonObject.TryGetProperty("Id", out JsonElement js_id))
        return;
    
    var id = js_id.GetInt32();
    
    var add_result = await Manager.TryAddToCartAsync(id, key);
    
    byte[] dataToSend;
    if (add_result)
    {
        dataToSend = JsonSerializer.SerializeToUtf8Bytes<int>((int)SentDataMessages.SUCCESS);
    }
    else
    {
        dataToSend = JsonSerializer.SerializeToUtf8Bytes<int>((int)SentDataMessages.ERROR);
    }
    await stream.WriteAsync(dataToSend, 0, dataToSend.Length);
}

客户端请求处理主函数代码

private async Task HandleClientAsync(TcpClient client)
{
    try
    {
        NetworkStream stream = client.GetStream();
        byte[] buffer = new byte[102400];
        int bytesRead;
        
        while (!breakpoint && (bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length)) > 0)
        {
            if (breakpoint)
                break;
            string data = Encoding.UTF8.GetString(buffer, 0, bytesRead);
            Console.WriteLine("Received: {0}", data);
            byte[] dataToSend = new byte[1];
            var jsonObject = JsonSerializer.Deserialize<JsonElement>(data);
            int query_code = jsonObject.GetProperty("QueryType").GetInt32();
            var user_name = string.Empty;
            var user_login = string.Empty;
            var user_password = string.Empty;
            var category = string.Empty;
            int count = 0;
            int id = 0;
            switch (query_code)
            {
                case (int)QueryTypes.EXIT:
                    Exit(client, stream);
                    break;
                case (int)QueryTypes.LOGIN:
                    await LoginAsync(jsonObject, stream);
                    break;
                case (int)QueryTypes.REGISTER:
                    await RegisterAsync(jsonObject, stream);
                    break;

                case (int)QueryTypes.SEARCH:
                    await SearchAsync(jsonObject, stream);
                    break;
                case (int)QueryTypes.GET_CART:
                    await GetCartAsync(stream);
                    break;
                case (int)QueryTypes.GET_BY_ID:
                    await GetByIdAsync(jsonObject, stream);
                    break;

                case (int)QueryTypes.ADD_TO_CART:
                    await AddToCartAsync(jsonObject, stream);
                    break;
                case (int)QueryTypes.DELETE_FROM_CART:
                    await DeleteFromCartAsync(jsonObject, stream);
                    break;
                case (int)QueryTypes.SET_CART_ITEM_COUNT:
                    await SetCartItemCountAsync(jsonObject, stream);
                    break;
            }
        }

        
    }
    catch (Exception ex)
    {
        Console.WriteLine("Exception: {0}", ex);
    }

}

我尝试过线程锁、全异步处理以及事务,但都无法解决问题。

内容的提问来源于stack exchange,提问作者mary jane

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 21:59:54