| | 37 | |
| | 38 | == Трансакции == |
| | 39 | |
| | 40 | === 1. Креирање на продажба (!SaleService.cs) === |
| | 41 | |
| | 42 | Зошто Transaction? |
| | 43 | |
| | 44 | Кога се креира продажен запис, количината мора да се намали од залихата. Ако настане грешка при намалувањето на залихата, тогаш и продажниот запис не треба да се зачува, за да се обезбеди податоците да останат конзистентни. |
| | 45 | |
| | 46 | {{{ |
| | 47 | public async Task<bool> CreateSaleAsync(Sale sale) |
| | 48 | { |
| | 49 | using var transaction = await _context.Database.BeginTransactionAsync(); |
| | 50 | try |
| | 51 | { |
| | 52 | _context.Sales.Add(sale); |
| | 53 | await _context.SaveChangesAsync(); |
| | 54 | |
| | 55 | foreach (var item in sale.SaleItems) |
| | 56 | { |
| | 57 | var stock = await _context.WarehouseStocks |
| | 58 | .FirstOrDefaultAsync(ws => ws.WarehouseId == sale.WarehouseId |
| | 59 | && ws.ProductId == item.ProductId); |
| | 60 | |
| | 61 | if (stock == null || stock.QuantityOnHand < item.Quantity) |
| | 62 | { |
| | 63 | throw new Exception("Insufficient Stock"); |
| | 64 | } |
| | 65 | |
| | 66 | stock.QuantityOnHand -= item.Quantity; |
| | 67 | stock.LastUpdated = DateTime.Now; |
| | 68 | } |
| | 69 | |
| | 70 | await _context.SaveChangesAsync(); |
| | 71 | await transaction.CommitAsync(); |
| | 72 | |
| | 73 | return true; |
| | 74 | } |
| | 75 | catch |
| | 76 | { |
| | 77 | await transaction.RollbackAsync(); |
| | 78 | return false; |
| | 79 | } |
| | 80 | } |
| | 81 | }}} |