Bir sipariş oluşturulurken sipariş kaydı ekleniyor, stok azaltılıyor ve bildirim kuyruğuna kayıt bırakılıyor. Bu adımların ortasında hata oluşursa veritabanında yarım kalmış bir işlem oluşabilir. Yapay zekâ, kodu incelerken transaction sınırını fark edebilir; ancak hangi adımların aynı atomik işleme ait olduğunu geliştiricinin açıkça belirtmesi gerekir.
Küçük bir örnekte sorun şu şekilde görülebilir:
function createOrder(PDO $db, OrderRepository $orders, StockService $stock, Queue $queue, array $input): int
{
$db->beginTransaction();
$orderId = $orders->create($input['user_id'], $input['product_id']);
$db->commit();
$stock->decrease($input['product_id'], $input['quantity']);
$queue->push('order.created', ['order_id' => $orderId]);
return $orderId;
}Burada stok azaltma veya kuyruk kaydı başarısız olursa sipariş zaten commit edilmiştir. Ayrıca decrease() metodu kendi veritabanı bağlantısını ya da ayrı bir transaction kullanıyorsa, dışarıdaki transaction sınırı beklenenden farklı davranabilir.
AI incelemesinden yararlı bir sonuç almak
İnceleme isteminde yalnızca “transaction hatalarını bul” demek yerine işlem bütünlüğünü ve hata senaryolarını belirtmek daha iyi sonuç verir:
İş kuralları sipariş ile stok değişikliğinin birlikte başarılı olmasını gerektiriyorsa transaction sınırı servis katmanında tutulabilir:Bu PHP servisinde sipariş oluşturma, stok düşme ve ilgili olayın kalıcılaştırılması adımlarını incele. Hangi işlemler aynı atomik transaction içinde olmalı? Her adımın hata vermesi durumunda veritabanında hangi kayıtların kalabileceğini açıkla. Repository ve servislerin aynı PDO bağlantısını kullanıp kullanmadığını varsayma; belirsiz noktaları ayrıca listele.
function createOrder(PDO $db, OrderRepository $orders, StockService $stock, QueueRepository $queue, array $input): int
{
$db->beginTransaction();
try {
$orderId = $orders->create($input['user_id'], $input['product_id']);
$stock->decreaseUsingConnection(
$db,
$input['product_id'],
$input['quantity']
);
$queue->addUsingConnection($db, 'order.created', ['order_id' => $orderId]);
$db->commit();
return $orderId;
} catch (Throwable $exception) {
if ($db->inTransaction()) {
$db->rollBack();
}
throw $exception;
}
}Bu düzeltmede repository ve servislerin aynı PDO bağlantısını kullandığı açıkça gösterilir. Böylece stok yetersizliği veya olay kaydı sırasında oluşan bir hata, sipariş eklemesini de geri alabilir. Kuyruk sistemi gerçekten harici bir mesaj broker’ıysa, broker çağrısını veritabanı transaction’ına koymak aynı garantiyi sağlamaz. Bu durumda olayın veritabanında bekleyen bir kayıt olarak tutulması ve ayrı bir yayınlayıcı süreç tarafından gönderilmesi daha uygun olabilir.
AI önerisinin belirsizliğini kontrol etme
Model, yalnızca fonksiyon gövdesini görerek şu noktaları kesin biçimde bilemez:
- Repository metotlarının aynı bağlantıyı mı, yoksa yeni bağlantıları mı kullandığı
- Stok azaltma işleminin yetersiz stokta istisna mı attığı, yoksa sessizce başarısız mı olduğu
- Kuyruğun veritabanı tablosu mu yoksa harici bir servis mi olduğu
- Transaction açılmadan önce veya commit sonrasında başka kalıcı yan etkiler oluşup oluşmadığı
Doğrulama adımları
Önerilen düzeltmeyi test etmek için her hata noktasını ayrı ayrı tetikleyin:
- Sipariş oluşturma sırasında istisna oluşturun; sipariş kaydı kalmamalıdır.
- Stok azaltmayı başarısız yapın; sipariş ve olay kaydı birlikte geri alınmalıdır.
- Olay kaydı sırasında hata oluşturun; sipariş ile stok değişikliği kalıcı kalmamalıdır.
- Başarılı senaryoda tek sipariş, doğru stok değişimi ve tek olay kaydı oluştuğunu kontrol edin.
- Aynı bağlantının kullanıldığını test doubles veya bağlantı kimliğiyle doğrulayın.
- Commit sonrasında harici gönderim yapılıyorsa, gönderim hatasının yeniden denenme ve tekrar kayıt oluşturma davranışını ayrıca test edin.
