spring MVC 我想在控制层或者Service添加一个事务,就是同时对一张表的两种 *** 作

spring MVC 我想在控制层或者Service添加一个事务,就是同时对一张表的两种 *** 作,第1张

这是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()

}

}

同意1楼的兄弟说的,业务逻辑应该由service处理,造成需要在action开启事务的最根本原因主要是你的组件层API设计有问题,action中不该处理业务逻辑代码的,需要调多个service完成的功能其实就是一个业务,不过不按1楼说的把action放到spring托管也有办法在action手动开启事务,下边是我以前写的代码,当时是为了解决遗留系统的事务问题,你可以参考测试一下:

public interface ITransactionManager {

/**

* 该方法中是需要进行事务控制的内容

* @return

* @throws Exception

*/

Object doInTransaction() throws Exception

}

public class DataSourceTransactionUtil {

public Object execute(final ITransactionManager transactionManager){

DataSourceTransactionManager dataSourceTransactionManager = getDataSourceTransactionManager()

TransactionTemplate transactionTemplate = new TransactionTemplate(dataSourceTransactionManager)

return transactionTemplate.execute(new TransactionCallback(){

public Object doInTransaction(TransactionStatus transactionStatus) {

Object savepoint = transactionStatus.createSavepoint()

Object result = null

try{

result = transactionManager.doInTransaction()

} catch(Exception e){

transactionStatus.rollbackToSavepoint(savepoint)

e.printStackTrace()

} finally{

transactionStatus.releaseSavepoint(savepoint)

}

return result

}

})

}

private DataSourceTransactionManager getDataSourceTransactionManager(){

return (DataSourceTransactionManager)getBean("transactionManager")

}

}

解释一下:

这段代码我记得是看了spring源码后自己写的。

1、getBean("transactionManager")是获得spring中事务管理器那个bean,你自己改名字。

2、把这段代码放到你的BaseAction中:

protected Object beginTransaction(ITransactionManager transactionManagerImpl){

DataSourceTransactionUtil dt = new DataSourceTransactionUtil()

return dt.execute(transactionManagerImpl)

}

3.在你需要开启事务的action中调用beginTransaction方法transactionManagerImpl这个对象你写个匿名内部类然后实现doInTransaction() 方法,在doInTransaction() 中去写你调用多个service的代码


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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存