现实生活中事物运用很常见,比如银行存取业务,上级考试业务等,不会因为特殊情况的发生导致数据出现差异。要么一块执行,,要么回滚都不执行保存原状。
四大特性;
原子性(行为连贯,不可分割)
一致性(结果一致,没有歧义)
隔离性(分开操作,互不影响)
持久性(一旦变更,不可恢复)
7、Spring 编程式事务和声明式事务的区别
编程式事务:
通过编码方式实现事务,允许用户在代码中精确定义事务的边界。即类似于JDBC编程实现事务管理
管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。
编写代码麻烦
声明式事务处理:
管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
优点:
不需要通过编程的方式管理事务
不用在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明
(或通过基于@Transactional注解的方式),
便可以将事务规则应用到业务逻辑中。
总结:
编程式事务侵入到了业务代码里面,但是提供了更加详细的事务管理;而声明式事务由于基于AOP,所以既能起到事务管理的作用,又可以不影响业务代码的具体实现。
代码举例:
(一)编程式事务处理实现转账(TransactionTemplate )
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
BankServiceImpl public class BankServiceImpl implements IBankService { private IBankDao iBankDao; private TransactionTemplate tt;
//编程事务转账需要,注解方式不需要
public void setTt(TransactionTemplate tt) {
this.tt = tt;
}
public void setIBankDao(IBankDao iBankDao) {
this.iBankDao = iBankDao;
}
@Override
public void transfer(final String out, final String in,final int money) {
tt.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
iBankDao.in(in, money);
// int i=10/0;//设置异常,看是否同步
iBankDao.out(out, money);
}
});
}
(二)声明式事务处理实现转账(基于AOP的 xml 配置)
<tx:advice id=“txAdvice” transaction-manager=“txManager”>
tx:attributes
<tx:method name=“transfer” propagation=“REQUIRED” isolation=“DEFAULT”/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution(* com.bank.*.*(..))"/>
</aop:config>
public class BankServiceImpl implements IBankService {
private IBankDao iBankDao;
public void setIBankDao(IBankDao iBankDao) {
this.iBankDao = iBankDao;
}
public void transfer( String in, String out,int money) {
iBankDao.in(in, money);
// int i=10/0;//设置异常,看是否同步
iBankDao.out(out, money);
}
}
(三)声明式事务处理实现转账(基于AOP的 注解 配置)
<tx:annotation-driven transaction-manager=“txManager” proxy-target-class=“true”/>
@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.DEFAULT)
@Service(“bankService”)
public class BankServiceImpl implements IBankService {
private IBankDao iBankDao;
public void setIBankDao(IBankDao iBankDao) {
this.iBankDao = iBankDao;
}
public void transfer( String in, String out,int money) {
iBankDao.in(in, money);
// int i=10/0;//设置异常,看是否同步
iBankDao.out(out, money);
}
}