Я прочитал определения транзакций на этом сайте, а также некоторые другие внешние источники.Но мне трудно разобраться с определенным понятием транзакции при написании кода.
У меня есть класс 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:
public class InvoiceService implements InvoiceServiceInterface
{
private InvoiceServiceDaoInterface InvoiceServiceDao;
public void setInvoiceServiceDao(InvoiceServiceDaoInterface InvoiceServiceDao)
{
this.InvoiceServiceDao = InvoiceServiceDao;
}
@Override
public void writeInvoice(Widget purchasedWidget)
{
Date purchaseDate = new Date(new java.util.Date().getTime());
String isbn = purchasedWidget.getIsbn();
Purchases newPurchase = new Purchases(purchaseDate, isbn);
this.InvoiceServiceDao.savePurchase(newPurchase);
}
}
Являются ли эти два метода также вызываемыми транзакциями buyWidget?То есть, даже если ни один из этих методов не объявлен как транзакция.Каковы некоторые потенциальные ловушки, не позволяющие объявить два дочерних метода транзакциями?(Поскольку они, по-видимому, уже являются частью одного).