事务脚本
事务脚本
使用过程来组织业务逻辑,每个过程处理来自表现层的单个请求。对于很对业务应用来说都可以被看作是一系列事务。业务的一个请求将触发一系列的业务处理逻辑,而我们在代码中通常采用
事务脚本将所有这些业务逻辑组织成单个过程,在组织时通常都是考虑的业务逻辑的过程,将业务逻辑按照一定的顺序排列执行,然后将事务控制在某一个主方法的入口上,并且在过程中直接调用数据库,或者调用数据库封装器(如
对于事务脚本来说,很多时候都有
public void Save(){
Dao1 dao1=new Dao1(); dao1.IsExists();//检查一些东西
Dao2 dao1=new Dao2(); dao2.Save();//保存一些数据
}
public void Submit(){
try{
BeginTran();
Dao1 dao1=new Dao1(); dao1.IsExists();//检查一些东西
Dao2 dao1=new Dao2(); dao2.Save();//保存一些数据
Dao3 dao3=new Dao3(); dao3.GoToNextFlow();//流程提交
Commit();
}catch(){
Rollback();
}
}
事务脚本的优势是简单,容易上手,DAO(数据访问对象)的重用可能性高,强于经典的三层。不过与与使用
典型应用
这里以银行转账事务脚本实现为例,在事务脚本的实现中,关于在两个账号之间转账的领域业务逻辑都被写在了
public class MoneyTransferServiceTransactionScriptImpl
implements MoneyTransferService {
private AccountDao accountDao;
private BankingTransactionRepository bankingTransactionRepository;
. . .
@Override
public BankingTransaction transfer(
String fromAccountId, String toAccountId, double amount) {
Account fromAccount = accountDao.findById(fromAccountId);
Account toAccount = accountDao.findById(toAccountId);
// . . .
double newBalance = fromAccount.getBalance() - amount;
switch (fromAccount.getOverdraftPolicy()) {
case NEVER:
if (newBalance < 0) {
throw new DebitException("Insufficient funds");
}
break;
case ALLOWED:
if (newBalance < -limit) {
throw new DebitException(
"Overdraft limit (of " + limit + ") exceeded: " + newBalance);
}
break;
}
fromAccount.setBalance(newBalance);
toAccount.setBalance(toAccount.getBalance() + amount);
BankingTransaction moneyTransferTransaction =
new MoneyTranferTransaction(fromAccountId, toAccountId, amount);
bankingTransactionRepository.addTransaction(moneyTransferTransaction);
return moneyTransferTransaction;
}
}
这完全是面向过程的代码风格。