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
相关产品推荐
相关产品推荐

