问一个偏门的问题,关于spring声明式事务 本帖最后由 findhappy7 于 2010-04-21 13:59:58 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果会触发事务,因为出现异常,那么这个事务应该会有一个事务开始,和事务回滚吧?那怎样回滚?spring的事务回滚又会发什么? 这个源码没研究我的理解:你为这个方法声明了事务,哪他进入这个方法匹配了,那就开始事务遇见EXCEPETION了,事务就回滚回滚的时候发现没有找到回滚点,哪我不管了呗所以我说你这样意义何在? 怎样知道其开始了 事务了? debug信息好像没有,,, 我遇到一个这样一个问题:---------------------------------------------A.runSQL() 加上事务声明后,但发生异常后,触发了事务回滚,runSQL这个方法是有dataSource注入的,继承org.springframework.jdbc.core.support.JdbcDaoSupport这类然后我 A.runSQL()不加上事务声明,,,然后被添加到一个业务方法里面,,这个业务方法,没有数据库连接、数据源等的属性,,但这个业务方法加上了 事务声明,,,然后运行这个业务方法,发生异常的时候,却没有出现事务回滚的,,,, 你的意思是在有事务控制的业务方法里调用A.runSQL,出现异常,没有回滚? 下面是仿 spring aop做的! 一看你就知道他是怎么样控制了public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Long start = System.currentTimeMillis(); System.out.println("***************业务方法开始执行" + method.getName()); Logger logger = Logger.getLogger(method.getClass()); Object returnValue = null; try { // 开始事务 // HibernateSessionFactory.getSession().beginTransaction(); // 执行业务方法 returnValue = method.invoke(serviceObject, args); // hibernate业控制事务 HibernateSessionFactory.getSession().getTransaction().commit(); } catch (Exception e) { HibernateSessionFactory.getSession().getTransaction().rollback(); // 如果有异常就回滚 e.printStackTrace(); } Long end = System.currentTimeMillis(); Long result = end - start; System.out.println("***************业务方法执行结束" + method.getName()); System.out.println("方法用时" + result); return returnValue; } 是的,,郁闷死---------------------单单在A.runSQL里面加上事务声明,则log4j调为debug下打印:2010-04-21 14:32:54,921 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] - <Using transaction object [org.springframework.orm.hibernate3.HibernateTransactionManager$HibernateTransactionObject@f22777]>2010-04-21 14:32:54,921 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] - <Creating new transaction with name [com.cellcom.bizlets.database.component.Processor.execute]>2010-04-21 14:32:54,921 DEBUG [org.hibernate.impl.SessionImpl] - <opened session at timestamp: 12718315749>2010-04-21 14:32:54,921 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] - <Opened new Session [org.hibernate.impl.SessionImpl@1fd2a6e] for Hibernate transaction>。上面这些清楚的显示了创建事务的过程,,但 只是 在业务方法里面加上声明事务,则没有上面的过程,,郁闷中 关于引号问题 时间问题 HttpServletResponse 下载报错 关于微博的设计问题,大家探讨探讨 java连接mysql被拒绝 求一篇jsp对象的帮助文档 急急急,100分求怎样弄部分选择的checkbox tomcat报错 Syntax error on token "import", Identifier expected after this token 如何重新打开一个已经关闭了的连接 高分求一个用JSP做的留言板 灵异事件,ibatis多表查询问题 如何让table的border变细?
我的理解:
你为这个方法声明了事务,哪他进入这个方法匹配了,那就开始事务
遇见EXCEPETION了,事务就回滚
回滚的时候发现没有找到回滚点,
哪我不管了呗所以我说你这样意义何在?
---------------------------------------------
A.runSQL() 加上事务声明后,但发生异常后,触发了事务回滚,runSQL这个方法是有dataSource注入的,继承org.springframework.jdbc.core.support.JdbcDaoSupport这类然后我 A.runSQL()不加上事务声明,,,然后被添加到一个业务方法里面,,这个业务方法,没有数据库连接、数据源等的属性,,但这个业务方法加上了 事务声明,,,然后运行这个业务方法,发生异常的时候,却没有出现事务回滚的,,,,
throws Throwable {
Long start = System.currentTimeMillis();
System.out.println("***************业务方法开始执行" + method.getName());
Logger logger = Logger.getLogger(method.getClass());
Object returnValue = null;
try {
// 开始事务
// HibernateSessionFactory.getSession().beginTransaction(); // 执行业务方法
returnValue = method.invoke(serviceObject, args);
// hibernate业控制事务
HibernateSessionFactory.getSession().getTransaction().commit(); } catch (Exception e) {
HibernateSessionFactory.getSession().getTransaction().rollback();
// 如果有异常就回滚
e.printStackTrace();
} Long end = System.currentTimeMillis();
Long result = end - start;
System.out.println("***************业务方法执行结束" + method.getName());
System.out.println("方法用时" + result);
return returnValue; }
是的,,郁闷死
---------------------
单单在A.runSQL里面加上事务声明,则log4j调为debug下
打印:
2010-04-21 14:32:54,921 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] - <Using transaction object [org.springframework.orm.hibernate3.HibernateTransactionManager$HibernateTransactionObject@f22777]>
2010-04-21 14:32:54,921 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] - <Creating new transaction with name [com.cellcom.bizlets.database.component.Processor.execute]>
2010-04-21 14:32:54,921 DEBUG [org.hibernate.impl.SessionImpl] - <opened session at timestamp: 12718315749>
2010-04-21 14:32:54,921 DEBUG [org.springframework.orm.hibernate3.HibernateTransactionManager] - <Opened new Session [org.hibernate.impl.SessionImpl@1fd2a6e] for Hibernate transaction>
。
上面这些清楚的显示了创建事务的过程,,
但 只是 在业务方法里面加上声明事务,则没有上面的过程,,郁闷中