如何给Spring MVC的action加上事务

如何给Spring MVC的action加上事务,第1张

其实就是一个加载顺序的问题

首先使用了spring

MVC的项目是不需要配置action bean,而是通过spring

mvc的配置文件进行扫描注解加载的,spring事务配置文件还有上下文都是通过org.springframework.web.context.ContextLoaderListener加载的,而spring

MVC的action是通过org.springframework.web.servlet.DispatcherServlet加载的,这样就有个优先级的问题了,web是先启动ContextLoaderListener后启动DispatcherServlet,在ContextLoaderListener加载的时候action并没在容器中,所以现在使用AOP添加事务或者扫描注解都是无用的。

那么解决办法就是在DispatcherServlet加载的spring-MVC配置文件后再加上AOP事务扫描配置就OK了

1

2

3

4

5

6

7

8

<tx:advice id="defaultTxAdvice" transaction-manager="transactionManager">

<tx:attributes>

<tx:method name="questionReply" propagation="REQUIRED"/>

</tx:attributes>

</tx:advice>

<aop:config>

<aop:advisor advice-ref="defaultTxAdvice" pointcut="execution(* com.jeecms.cms.action.front.PhQuestionAct.*(..))"/>

</aop:config>

这是spring的批注式事务管理

你应该去找spring的书 或 官方文档看看

这里你需要理解的是 事务的传播行为

传播行为主要是用来告知何时该开始一个新的事务 或者 何时暂停一个事务等

如:Propagation.REQUIRED 就是传播行为中的一种

表示如果它的外部已经存在一个事务;则无需再开始新的事务;(他自然在这个事务中)

如果外面没有事务则开始一个新的事务

所有这种事务声明是可以嵌套的(虽然事务声明可以嵌套,但事务本身并没有嵌套,当然事务是不可嵌套的;正像上面讲的一样)

---------------------------------------------------------------------------

如你的问题中 同时对一张表的两种 *** 作

如果这两个 *** 作封装在不同的方法中,只需将这两个方法都声明为Propagation.REQUIRED

并把更上一层调用这两个子方法的 方法也声明为Propagation.REQUIRED

这种方式比较灵活,两个方法即可独立开始事务;也可加入上层事务;具体要看业务需要

如果这两个 *** 作封装在一个方法中,只需要将这个方法都声明为Propagation.REQUIRED即可

你用spring 的数据访问是hibernate 还是 ibatis 我这有一个ibatis的 希望呢帮到你

SqlMapClient client = getSqlMapClient()//先拿到sqlmapclient

try{

client.startTransaction()//创建事务

client.insert("addfriend",friend)这是个插入

client.update("updatefriend",friend)//这是个更新

client.commitTransaction()//提交事务

}catch (SQLException e){

try {

client.endTransaction()//回滚事务

} catch (SQLException e1) {

// TODO Auto-generated catch block

e1.printStackTrace()

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11422009.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存