请教:spring事务springmvc不起作用用

请教一个spring事务的问题_spring吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:9,821贴子:
请教一个spring事务的问题收藏
一个类实现了InitializingBean后,在afterPropertiesSet方法里取sessionFactory.getCurrentSession();,但是报异常
No Session found for current thread。说明spring的事务没有开启,但是已经配置了。想请教下各位大大是怎么回事
如果你改变看世界的方式,你就能改变你眼前的世界!问题可以去相关论坛“联动北方”提问,会有专人解答哦,《学习资源也有》!
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或Spring(43)
Spring事务失效的原因
5种大的原因
如使用mysql且引擎是MyISAM,则事务会不起作用,原因是MyISAM不支持事务,可以改成InnoDB
假如有兴趣了解 mysql中 ” engine=innodb ” 以及 ” engine=innodb 和engine=myisam的区别 “,可以读读这篇文章:
可使用下述语句之一检查表的标类型:
SHOW TABLE STATUS LIKE 'tbl_name';
SHOW CREATE TABLE tbl_
 使用下述语句,可检查mysqld服务器支持的存储引擎:
SHOW ENGINES;
也可以使用下述语句,检查与你感兴趣的存储引擎有关的变量值:
SHOW VARIABLES LIKE 'have_%';
 例如,要想确定InnoDB存储引擎是否可用,可检查have_innodb变量的值。
2. 如果使用了spring+mvc,则context:component-scan重复扫描问题可能会引起事务失败。
@Transactional 注解开启配置,必须放到listener里加载,如果放到DispatcherServlet的配置里,事务也是不起作用的。
4. @Transactional 注解只能应用到 public 可见度的方法上。 如果你在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也不会报错,事务也会失效。
5. Spring团队建议在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上。在接口上使用 @Transactional 注解,只能当你设置了基于接口的代理时它才生效。因为注解是 不能继承 的,这就意味着如果正在使用基于类的代理时,那么事务的设置将不能被基于类的代理所识别,而且对象也将不会被事务代理所包装。
需要注意的事项
Spring的Transactional的API文档:
If no rules are relevant to the exception, it will be treated like DefaultTransactionAttribute (rolling back on runtime exceptions).
在业务代码中,有如下两种情况,比如:
throw new RuntimeException(“xxxxxxxxxxxx”); 事务回滚
throw new Exception(“xxxxxxxxxxxx”); 事务没有回滚
spring内部catch的就是 RuntimeException, service抛出RuntimeException可以回滚
如果抛出Exception,就不回滚….
1).Spring的AOP即声明式事务管理默认是针对unchecked exception回滚。也就是默认对RuntimeException()异常或是其子类进行事务回滚;checked异常,即Exception可try{}捕获的不会回滚,如果使用try-catch捕获抛出的unchecked异常后没有在catch块中采用页面硬编码的方式使用spring api对事务做显式的回滚,则事务不会回滚, “将异常捕获,并且在catch块中不对事务做显式提交=生吞掉异常” ,要想捕获非运行时异常则需要如下配置:
解决办法:
1.在针对事务的类中抛出RuntimeException异常,而不是抛出Exception。
2.在txAdive中增加rollback-for,里面写自己的exception,例如自己写的exception:
id="txAdvice" transaction-manager="transactionManager"&
     name="*" rollback-for=".untils.exception.XyzException"/&
或者定义不会滚的异常
id="txAdvice"&
name="update*" no-rollback-for="IOException"/&
name="*"/&
2).spring的事务边界是在调用业务方法之前开始的,业务方法执行完毕之后来执行commit or rollback(Spring默认取决于是否抛出runtime异常).
如果抛出runtime exception 并在你的业务方法中没有catch到的话,事务会回滚。
一般不需要在业务方法中catch异常,如果非要catch,在做完你想做的工作后(比如关闭文件等)一定要抛出runtime exception,否则spring会将你的操作commit,这样就会产生脏数据.所以你的catch代码是画蛇添足。
} catch(Exception e) {
由此可以推知,在spring中如果某个业务方法被一个 整个包裹起来,则这个业务方法也就等于脱离了spring事务的管理,因为没有任何异常会从业务方法中抛出!全被捕获并吞掉,导致spring异常抛出触发事务回滚策略失效。
不过,如果在catch代码块中采用页面硬编码的方式使用spring api对事务做显式的回滚,这样写也未尝不可。
3).基于注解的事务:
Transactional的异常控制,默认是Check Exception 不回滚,unCheck Exception回滚
如果配置了rollbackFor 和 noRollbackFor 且两个都是用同样的异常,那么遇到该异常,还是回滚
rollbackFor 和noRollbackFor 配置也许不会含盖所有异常,对于遗漏的按照Check Exception 不回滚,unCheck Exception回滚
如果只是@Transactional失效的话,可以考虑改成:@Transactional(rollbackFor=Exception.class)
例子如下,在注释的代码上加入:
@Transactional(value="transactionManager", rollbackFor=java.lang.Exception.class)
@Transactional(rollbackFor=Exception.class)
配置文件:
id="studentMGDataSource" class="mons.dbcp.BasicDataSource"
destroy-method="close"&
name="driverClassName" value="${student_MG_jdbc.driver}" /&
name="url" value="${student_MG_jdbc.url}" /&
name="username" value="${student_MG_jdbc.username}" /&
name="password" value="${student_MG_jdbc.password}" /&
name="initialSize" value="${student_MG_jdbc.initialSize}" /&
name="maxActive" value="${student_MG_jdbc.maxActive}" /&
name="maxIdle" value="${student_MG_jdbc.maxIdle}" /&
name="maxWait" value="${student_MG_jdbc.maxWait}" /&
name="defaultAutoCommit" value="${student_MG_jdbc.defaultAutoCommit}" /&
id="studentMGSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"&
name="configLocation" value="classpath:mybatis/mybatis-studentMG-config.xml" /&
name="dataSource" ref="studentMGDataSource" /&
id="studentMGSqlSession" class="org.mybatis.spring.SqlSessionTemplate"&
index="0" ref="studentMGSqlSessionFactory" /&
id="studentMGTxManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&
name="dataSource" ref="studentMGDataSource" /&
proxy-target-class="true" transaction-manager="studentMGTxManager" /&
在类中这样使用
@Transactional(value="studentMGTxManager",rollbackFor=java.lang.Exception.class)
public void saveStudentDto(List&StudentDto& dtoList, String classId) {
上面的小例子转自:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:427718次
积分:5709
积分:5709
排名:第3363名
原创:154篇
转载:278篇
评论:51条
(1)(5)(4)(12)(34)(14)(6)(34)(38)(6)(25)(18)(10)(3)(19)(21)(19)(5)(2)(10)(13)(20)(7)(1)(1)(5)(1)(1)(1)(1)(2)(2)(1)(5)(4)(5)(3)(2)(1)(1)(5)(6)(1)(1)(3)(1)(1)(2)(1)(1)(3)(3)(5)(2)(3)(6)(2)(4)(2)(3)(2)(1)(1)> 请教关于spring事务管理的怪问题,事务没有自动提交。大哥们请帮帮忙最近想要搭建一个spring
请教关于spring事务管理的怪问题,事务没有自动提交。大哥们请帮帮忙最近想要搭建一个spring
keletao & &
发布时间: & &
浏览:67 & &
回复:0 & &
悬赏:0.0希赛币
请教关于spring事务管理的怪问题,事务没有自动提交。大哥们请帮帮忙!最近想要搭建一个spring和hibernate的系统,一切准备就绪,但是在测试的时候发现了个怪问题。
问题是这样的,代码可以正常运行,但是测试数据入库时发现不调用testDAO.getHibernateTemplate().getSessionFactory().close();这一句代码的话,在数据库里就查不到数据;调用这句之后就可以正常入库了。
实在是几天没搞定,想请各位大哥帮帮忙指点一下。
运行环境是:
&&&&&&JDK1.6
&&&&&&spring3.0(由myeclipse8.5自动导入的)
&&&&&&hibernate3.3(由myeclipse8.5自动导入的)
&&&&&&oracle&10g_r2
先上测试代码:
1、调用main类
  package&
import&www.am8.manage.TestManageI
public&class&SSHTest&{
public&static&void&main(String&args[])&&
&&&& TestManageImpl&tmi=new&TestManageImpl();
&&&& tmi.shiwuSaveTest();
2、manage类
  package&www.am8.
import&java.util.C
import&org.springframework.beans.factory.BeanF
import&org.springframework.beans.factory.xml.XmlBeanF
import&orre.io.ClassPathR
import&orre.io.R
import&www.am8.iface.TestM
import&www.am8.pojo.T
import&www.am8.pojo.TestDAO;
public&class&TestManageImpl&implements&TestManage&{
private&TestDAO&iTestDAO;
public&TestDAO&getiTestDAO()&{
return&iTestDAO;
public&void&setiTestDAO(TestDAO&iTestDAO)&{
this.iTestDAO&=&iTestDAO;
public&void&shiwuSaveTest()&{
Resource&res&=new&ClassPathResource("applicationContext.xml");&&&&&&&
&&&&&&&&BeanFactory&factory&=&new&XmlBeanFactory(res);&&
&&&&&&&&//从BeanFactory获取UserDAO&&
&&&&&&&&TestDAO&testDAO&=&(TestDAO)&factory.getBean("TestDAO");
&&&&&&&&Test&t&=&new&Test();
&&&&&&&&Calendar&c&=&Calendar.getInstance();
&&&&&&&&t.setTestId(21);
&&&&&&&&t.setShiJian(c.getTime());
&&&&&&&&t.setVar2("中文!!");
&&&&&&&&t.setChangZhengShu(23551);
&&&&&&&&t.setShiJian2("");
&&&&&&&&testDAO.save(t);
&&&&&&&&//testDAO.getHibernateTemplate().getSessionFactory().close();
3、applicationContext.xml
  & xml&version="1.0"&encoding="UTF-8" &
&beans&xmlns=""
&&&&xmlns:xsi=""
&&&&xmlns:context=""
&&&&xmlns:aop=""
&&&&xmlns:tx=""
&&&&xsi:schemaLocation="
本问题标题:
本问题地址:
温馨提示:本问题已经关闭,不能解答。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&JAVA Web开发 &&&&最新内容
JAVA Web开发 &&&&随机内容匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。}

我要回帖

更多关于 spring 切面 不起作用 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信