Çoklu Hizmet Katmanlar ve Veritabanı İşlemleri

2 Cevap php

Ben sadece iyi çoklu servis katmanlar arasında işlemlerinizi nasıl merak ediyorum. Hizmet katmanları saklamak ve veritabanından almak için bir ORM kullanın. Işlemleri bilinen ve bireysel hizmet katmanları içinde ele alınmalıdır? Ya da başka bir katman ile ele alınmalıdır?

Örneğin: kullanıcılar ve müşteriler için iki servis katmanları var. Ben istiyorum:

1) Create and save a new client
2) Create and save a new user
3) Assign that user to the client

Tüm tek bir işlem içinde.

Basit bir örnek şöyle olabilir:

$userManagementService = new UserManagementService;
$newUserData = array(...);
$newUser = $userManagementService->create($newUserData);

$clientManagementService = new ClientManagementService;
$newClientData = array(...);
$newClient = $clientManagementService->create($newClientData);

$userManagementService->assignUserToClient($newUser, $newClient);

Nereye işlem mantığı gitmeli?

2 Cevap

Hizmet katmanları içinde veya ORM içinde iç içe geçmiş işlem yapmaya kalkmayın.

İşlemler DB bağlantısı için geneldir. RDBMS doğal iç içe işlemleri destekler and DB API iç içe geçmiş işlem ortaya sürece, anomaliler içine çalıştırabilirsiniz.

Ayrıntılar için How do detect that transaction has already been started? benim cevaba bakınız

PHP kullanarak konum beri, senin işlemlerin kapsamı en tek bir istek olduğunu. Yani, sadece hizmet-katmanlı Transa, konteyner-yönetilen işlemler değil kullanmalısınız. Yani, işleme isteği başında hareketi başlatmak ve isteğini ele bitirmek gibi (ya da geri alma) taahhüt.

Bir geri alma gerektiren bir istisna derin iç içe ORM eylemler içinde olursa, o kabarcık o kadar bir özel durum kullanarak ve konteyner (yani PHP eylem denetleyici) icabına atalım tarafından.

Eğer işlemlerin bir toplama karşı karşıya mı? Bu sahte kod Söylediklerinin ne düşündüğünü uyuyor mu?

try
    begin application transaction
    begin ORM transaction 1
       create new user
       commit request
    begin ORM transaction 2
       create new client
       commit request
    begin ORM transaction 3
       create user client association
       commit request
    commit application tx
catch()
    abort ORM tx 3
    abort ORM tx 2
    abort ORM tx 1
    abort app tx

Herhangi bir noktada iç içe bir işlemin geri alma olası bir istisna atar, ve bu istisnalar mantıklı two-phase commit tüm iç içe geçmiş hareketleri geri almak istiyorum.

Ben tho sonra ne konum almak olmayabilir.