SSM整合后事务不起作用的原因及解决

问题及原因:

SSM整合之后事务不起作用。在刚学习完SSM整合后我意识到了框架的魅力,spring为我们提供了声明式事务管理,但是在整合之后,我发现不起作用了。
在保存账户信息后我故意写了一个错误代码,测试事务是否可以控制,但是结果数据依旧保存进了数据库。
在这里插入图片描述
我试着将事务通知的属性改为任何异常都回滚,但依旧不起作用,因为默认就是任何异常都回滚。
在这里插入图片描述
经过网上查询,发现spring容器是springmvc容器的父容器,并且利用注解配置spring和springmvc的时候。
需要注意:
(1)扫描包spring和springmvc一定要分开扫描自己需要扫的。
(2)spring理应扫描dao和service层的包,而springmvc应该扫描controller层包。
(3)如果springmvc扫描了service和dao层包将操作数据库的对象装入springmvc容器,那么此时项目将不再支持事务控制。

原因:
事务控制是spring提供的,而如果由springmvc容器扫描service和dao层进行创建的数据库操作对象,就不再支持事务控制。

解决:

将springmvc中扫描包的位置base-package精确到conroller:
在这里插入图片描述
需要注意的是:
(1)context:include-filter 标签的意思是先扫描base-package下的内容,另外再加进来 expression 指定的内容。
(2)context:exclude-filter 标签的意思是不扫描 expression 指定的内容。
所以如果不精确到controller,springmvc会将service和dao一起扫描,也就导致了事务不起作用。
我的包结构如下:
在这里插入图片描述

参考:
我是看了这两篇大佬的博客才改对的Bug,有些地方我讲的不是很好,尤其是spring容器和springmvc容器只是带过,大家可以去看第一篇。第二篇则详细讲了两个标签的含义。
(1)ssm整合后事务不起作用的原因及解决
(2)context:include-filter和context:exclude-filter使用时要注意的地方

发布了57 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42419462/article/details/104229934