
你应该去找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的代码
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)