1.spring事物处理机制分为两种一种为声明式事物、一种为编程式事物
声明式事物建立在AOP 基础之上
本质是对方法的拦截 即在一个方法开始之前加入一个事物 目标方法执行完成后 进行事物提交或者是回滚
好处: 将业务逻辑代码和事物代码区分
不足: 和编程式事物相比 声明式事物最细粒度之能作用到方法 ,二编程式事物可以作用到代码块
spring 配置事物总是由3部分组成 datesource transactionManager 和 代理机制组成
datesource 、和transactionManager 这两部分只是会根据数据访问方式有所变化
比如使用Hibernate进行数据访问时,DataSource实际为SessionFactory,TransactionManager的实现为HibernateTransactionManager。
注意:sessionFactorty和transactionManager是下面5中配置方式的基本配置,
第一种方式:每个Bean都有一个代理
第二种方式:所有Bean共享一个代理基类
第三种方式:使用拦截器
第四种方式:使用tx标签配置的拦截器 (常用)
第五种方式:全注解
编程式事物
Spring的编程式事务即在代码中使用编程的方式进行事务处理,可以做到比声明式事务更细粒度。有两种方式一是使用TransactionManager,
另外就是TransactionTemplate。
1)
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
private HibernateTransactionManager transactionManager;
private DefaultTransactionDefinition def;
public HibernateTransactionManager getTransactionManager() {
return transactionManager;
}
public void setTransactionManager(HibernateTransactionManager transactionManager) {
this.transactionManager = transactionManager;
}
public void createTransactionDefinition() {
def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
def.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
}
public void saveOrUpdate(User user) {
TransactionStatus status = transactionManager.getTransaction(def);
try {
this.getHibernateTemplate().saveOrUpdate(user);
} catch (DataAccessException ex) {
transactionManager.rollback(status);
throw ex;
}
transactionManager.commit(status);
}
}
2)TransactionTemplate方式
ResultDto ret = null;
ret = (ResultDto) this.transactionTemplate.execute(new TransactionCallback() {
@Override
public Object doInTransaction(TransactionStatus status) {
ResultDto ret = null;
try {
drillTaskDao.deleteByKey(taskid);
} catch (Exception e) {
logger.error("delDrillTask:" + e.getMessage(), e);
ret = ResultBuilder.buildResult(ResultBuilder.FAIL_CODE, null, ErrorCode.COM_DBDELETEERROR);
return ret;
}
finally {
status.setRollbackOnly();
}
ret = cleartaskrelativedata(taskid, appid, true);
return ret;
}
});
return ret;