我已閱讀本網站上的交易定義以及一些其他外部來源。但是在編寫代碼時,我很難與交易的具體概念作鬥爭。什麼使事務成爲Spring/Java(特定場景)中的事務?
我有一個BuyService類是事務性的。 BuyService類被聲明爲事務性的,唯一的方法是buyWidget(String widgetId)。此方法調用ExampleService類,該類具有deleteWidgit(String widgetId)方法。它還調用InvoiceService類,該類使用writeInvoice(String widgitId)方法。下面是代碼:
BuyService類:
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@Transactional
public class BuyService implements BuyServiceInterface
{
private ExampleServiceInterface exampleService;
private InvoiceServiceInterface invoiceService;
public void setExampleService(ExampleServiceInterface exampleService)
{
this.exampleService = exampleService;
}
public void setInvoiceService(InvoiceServiceInterface invoiceService)
{
this.invoiceService = invoiceService;
}
@Override
@Transactional(propagation=Propagation.REQUIRED)
public void buyWidget(Widget widgetId)
{
try
{
Widget purchasedWidget = this.exampleService.getWidgetById(String widgetId);
this.exampleService.deleteWidget(purchasedWidget);
this.invoiceService.writeInvoice(purchasedWidget);
}
catch (WidgetNotFoundException e)
{
System.out.println("Widget with widgetId " + widgetId + " not found.");
}
}
}
我敢肯定的是,buyWidget方法構成了交易。它需要刪除數據庫中的小部件(在exampleService中)以及將數據插入購買數據庫(在invoiceService中)。但在此之後,我對術語感到困惑。方法deleteWidget和writeInvoice自己的事務嗎?
ExampleService類:
public class ExampleService implements ExampleServiceInterface
{
private ExampleServiceDaoInterface dao;
public void setExampleServiceDao(ExampleServiceDaoInterface dao)
{
this.dao = dao;
}
@Override
public void deleteWidget(Widget oldWidget)
throws WidgetNotFoundException
{
this.dao.delete(oldWidget);
}
@Override
public Widget getWidgetById(String widgetId)
{
return this.dao.getById(widgetId);
}
}
InvoiceService類:
是兩種方法buyWidget交易呼籲呢?也就是說,即使這些方法都沒有被聲明爲事務。 沒有將兩個子方法聲明爲交易有什麼潛在的缺陷? (因爲它們顯然已經成爲一部分)。
通常是一個好主意,省去代碼不直接與問題,如訪問者/ mutators /例外等代碼 –