刚刚学习Spring的时候、就只知道Spring有事务管理这么一说、然而到现在也只是学到一点点基础的东西!
与其说是分享倒不如说是提问了呵呵!
前提:在定义好Spring的事务管理配置、跟aop切面过后。
一般切面都定义在Service层、
然后里面以什么什么开头的方法*这样!
<tx:method name="insert*" propagation="REQUIRED" />
那么Spring在你这个方法运行完了过后呢就会给你自动提交或者回滚、!
那么在什么情况下正常提交、在什么情况下又会自动回滚呢!
在方法正常运行完毕过后呢、Spring就会自动给你提交。
在方法发生异常过后呢、Spring就会自动回滚你的事务!
下面是一个案例:
需求:循环添加一组数据到数据库、当其中一条数据添加出错、则所有数据都要回滚!
那么首先在dao层的时候我们定义的方法要抛出异常、这样Service层才能够捕获得到!
如(Dao):/**
* 添加
*/
public int insert(Object obj) throws Exception {
String sql = "insert into bpip_unit(unitid) values('"+obj+"')";
Query q = super.getSession().createSQLQuery(sql);
return q.executeUpdate();
} 那么在Service层就开始捕获:boolean bool = false;
try{
for (int i = 0; i < bp.length; i++) {
int num = baseDao.insert(bp[i]);
if (num > 0) {
bool = true;
}
}
}catch(Exception ex){
bool = false;
ex.printStackTrace();
}
return bool; 1、必须在Service层做循环操作因为Serivce的方法一执行完毕就会提交事务、事务已提交数据就入库了、这样就会出现原本应该一起入库的信息出现了"落单"的情况。
2、在Dao层只需要(也必须)抛出异常、不需要捕获、如果你在Dao层捕获异常信息、那么方法还是回走下去。在Service这边就不知道你Dao层到底有没有出异常了!这个是我知道的Spring事务处理方面的东西、可能有很多个人观点在里面、也有可能自己闭门造车!
在此希望各位能说说各位是怎么用Spring的事务处的!
感激不尽!
与其说是分享倒不如说是提问了呵呵!
前提:在定义好Spring的事务管理配置、跟aop切面过后。
一般切面都定义在Service层、
然后里面以什么什么开头的方法*这样!
<tx:method name="insert*" propagation="REQUIRED" />
那么Spring在你这个方法运行完了过后呢就会给你自动提交或者回滚、!
那么在什么情况下正常提交、在什么情况下又会自动回滚呢!
在方法正常运行完毕过后呢、Spring就会自动给你提交。
在方法发生异常过后呢、Spring就会自动回滚你的事务!
下面是一个案例:
需求:循环添加一组数据到数据库、当其中一条数据添加出错、则所有数据都要回滚!
那么首先在dao层的时候我们定义的方法要抛出异常、这样Service层才能够捕获得到!
如(Dao):/**
* 添加
*/
public int insert(Object obj) throws Exception {
String sql = "insert into bpip_unit(unitid) values('"+obj+"')";
Query q = super.getSession().createSQLQuery(sql);
return q.executeUpdate();
} 那么在Service层就开始捕获:boolean bool = false;
try{
for (int i = 0; i < bp.length; i++) {
int num = baseDao.insert(bp[i]);
if (num > 0) {
bool = true;
}
}
}catch(Exception ex){
bool = false;
ex.printStackTrace();
}
return bool; 1、必须在Service层做循环操作因为Serivce的方法一执行完毕就会提交事务、事务已提交数据就入库了、这样就会出现原本应该一起入库的信息出现了"落单"的情况。
2、在Dao层只需要(也必须)抛出异常、不需要捕获、如果你在Dao层捕获异常信息、那么方法还是回走下去。在Service这边就不知道你Dao层到底有没有出异常了!这个是我知道的Spring事务处理方面的东西、可能有很多个人观点在里面、也有可能自己闭门造车!
在此希望各位能说说各位是怎么用Spring的事务处的!
感激不尽!
关于Spring方面的!
原帖地址:http://topic.csdn.net/u/20120816/11/0716a665-61ae-4092-9fce-69f162c90016.html这个是他的配置: <tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="del*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="*" propagation="SUPPORTS" read-only="true" />
</tx:attributes>
</tx:advice>Service:public void saveUser(USM_USER User) {
this.userDao.saveObject(User);
//做2次插入,按道理第二次会失败,那应该要回滚第一次的插入吧
this.userDao.saveObject(User);
}dao:public Serializable saveObject(E entity) {
Serializable id = null;
try {
id = getHibernateTemplate().save(entity);
} catch (Exception e) {
logger.error("保存实体对象异常,对象是" + entity, e);
return null;
}
return id;
}----------------------------------------------------------------------
不能回滚的原因呢!
主要是因为他在dao底层处理的异常、没有把它抛出!
Service呢、捕获不到、所以就回滚不了事务了!做法呢有很多种:
注意一点、在默认情况下spring只会在发生RuntimeException及其子类的异常时回滚。
如果需要捕获其它异常呢、可以在配置中添加:<!--如果使用:org.springframework.transaction.interceptor.TransactionProxyFactoryBean-->
<prop key="insert">PROPAGATION_REQUIRED,-Exception</prop>
<!--如果使用:org.springframework.orm.hibernate3.HibernateTransactionManager-->
<tx:method name="save*" propagation="REQUIRED" rollback-for="Exception" />
<!--或者使用-->
<tx:method name="save*" propagation="REQUIRED" rollback-for="java.lang.Exception" />Exception跟java.lang.Exception都行!
值得注意的是、在Service中他的代码就不能try{}catch{}。
如果try{}catch{}的话、事务就不会回滚了!
必须throws Exception!