如何给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>

插入事物很简单,首先你需要了解事物的概念,事物是什么

然后插入事物的快捷方式是ctrl+t开始事物,ctrl+d结束事物,在loadrunner工具栏中,也有快捷插入事物的按钮

lr_start_transaction("登录")开始事物

lr_end_transaction("登录",LR_PASS)结束事物,表示事物通过FAIL表示不通过,LR_LR_AUTO根据返回值自动判断是否通过

比如登录可以作为一个事物,从输入密码到加载完全部首页内容

查询可以作为一个事物,输入内容,点击搜索,出来需要的东西

先说jfinal 有哪些事务处理方式:

1、声明式事务

ActiveRecord支持声明式事务,声明式事务需要使用ActiveRecordPlugin提供的拦截器来实现,拦截器的配置方法见Interceptor有关章节。仅声明了一个Tx拦截器即为action添加了事务支持。除此之外ActiveRecord还配备了TxByActionKeys、TxByActionKeyRegex、TxByMethods、TxByMethodRegex,分别支持actionKeys、actionKey正则、actionMethods、actionMethod正则声明式事务,TxByRegex拦截器可通过传入正则表达式对action进行拦截,当actionKey被正则匹配上将开启事务。TxByActionKeys可以对指定的actionKey进行拦截并开启事务,TxByMethods可以对指定的method进行拦截并开启事务。特别注意:声明式事务默认只针对主数据源进行回滚,如果希望针对 “非主数据源” 进行回滚,需要使用注解进行配置

2、Db.tx 事务

除了声明式事务以外,还可以直接使用代码来为一段代码添加事务,以下是示例代码:

Db.tx(new IAtom() {

   public boolean run() throws SQLException {

      Db.update("update t1 set f1 = ?", 123)

      Db.update("update t2 set f2 = ?", 456)

      return true

   }

})

以上代码中的两个 Db.update 数据库 *** 作将开启事务。Db.tx 做事务的好处是控制粒度更细,并且可以通过  return false 进行回滚,也即不必抛出异常即可回滚。

与声明式事务一样,Db.tx 方法默认针对主数据源进行事务处理,如果希望对其它数据源开启事务,使用 Db.use(configName).tx(...) 即可。

注意:MySql数据库表必须设置为InnoDB引擎时才支持事务,MyISAM并不支持事务。

也就是说如果你需要使用Db等工具 *** 作数据库, 那么jfinal 自己的事务处理已经满足需要.

如果使用的是Spring系数据库 *** 作工具, 那么就直接使用spring事务就可以了, 不存在引入一说了. 如果说的是项目启动时需要启动相应工具的话:

在 JFinalConfig 继承类中可以添加 afterJFinalStart() 与 beforeJFinalStop(),JFinal 会在系统启动完成之后以及系统关闭之前分别回调这两个方法, 或者在configPlugin(..)此方法用来配置JFinal的Plugin


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

原文地址:https://54852.com/bake/11389608.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存