Транзакции должны управляться на уровне приложения. Скажем, например, у вас был аккаунт DAO:
public class AccountDAO {
public void DebitAccount( int accountId, int dollars ) {
}
public void CreditAccount( int accountId, int dollars ) {
}
}
Если бы я хотел перевести деньги между счетами, я бы позвонил DebitAccount
на один счет и CreditAccount
на другой. Я хотел бы, чтобы эти вызовы происходили в одной транзакции. DAO не может этого знать, но уровень приложений будет.
Если бы транзакциями управляли на уровне DAO, вам нужно было бы создать другой метод TransferMoney
в DAO, чтобы сделать это за одну транзакцию. Это в конечном итоге приведет к раздуванию вашего уровня DAO и, для сложных операций, принесет бизнес-логику, которой, вероятно, не должно быть. И это еще более усложняет ситуацию, если у вас есть операция, требующая участия нескольких DAO в одной транзакции.