Dojo
最新
最佳
搜索
订阅
解道Jdon
架构设计
领域驱动
DDD介绍
DDD专辑
战略建模
领域语言UL
领域事件
商业分析
工作流BPM
规则引擎
架构师观点
数据工程
产品经理
系统思维
微服务
微服务介绍
微服务专辑
模块化设计
SOA
API设计
clean架构
SpringBoot
分布式事务
分布式架构
Kubernetes
DevOps
编程设计
GoF设计模式
模式专辑
面向对象
函数式编程
编程语言比较
编程工具比较
形式逻辑
前端编程
Reactive编程
Jdon框架
Rust语言
ChatGPT
Web3
模因梗
幽默梗
程序员吐槽
面试技巧
Java入门
数字化转型
认知偏差
道德经
GitHub工具
更多话题
open session in view引起的事务问题
08-05-05
power1128
最近在做项目的时候用到了hibernate,由于lazyload的问题,接触到了open session in view这种解决方案,但是实践下来的效果却让我对这个方法产生了怀疑.
就拿session-per-request来举例,也就是从request到response之间一直打开session.按照官方教程,我们肯定需要一个filter或者interceptor,完成打开和关闭session的任务.其它所有的方法都使用getCurrentSession来获得当前的持久context.现在如果我们在表现层(例如Struts的Action)修改了一个对象,然后调用相应的service更新它.此时service抛出了业务异常,需要我们取消之前的更新,这时如果不再Action中编写事务控制的代码,刚才的更改是无法rollback的(因为此时所有对象都是persistent状态,一旦更改后需要事务代码来回滚,而不像detached对象)
大家在这里是怎么解决的呢?我觉得这样反而需要在表现层引入事务控制语句,反而把事情搞复杂了
[该贴被power1128于2008-05-05 16:08修改过]
oojdon
2008-05-06 10:29
都在谈open session in view,如果我用jpa还会存在open session in view吗?
wlmouse
2008-05-06 11:15
表现层打开Session的时候,事务我记得是只读的。只有到达声明事务管理器的Service的时候,事务才变成可写。一切的事务处理均由声明的管理器负责。所以你不用再业务里写任何处理事务代码。只需要在XML或注释里声明就是了。
所以不用担心你出现的问题。
banq
2008-05-06 17:49
关键是在Action中只能一次调用Service,如果两次调用,这两次之间也需要事务,而且发生两次调用基本都是业务设计写入了Action。
power1128
2008-05-07 10:25
-->表现层打开Session的时候,事务我记得是只读的。只有到达声明事务管理器的Service的时候,事务才变成可写。
我想我最迷惑的地方就在这里.在表现层由于拿到的是持久对象,如果这时事务也是可写的,那么表现层程序员可以随意的调用set来更新entity,完全不用调用service中的update方法,而且是不可回滚的(因为不在业务层的事务控制范围内).我按你的方法先试试,有问题再来请教,多谢wlmouse
power1128
2008-05-07 10:29
-->关键是在Action中只能一次调用Service,如果两次调用,这两次之间也需要事务,而且发生两次调用基本都是业务设计写入了Action
banq大哥,我在Action中先调用了load方法,再调用了update方法,虽然都是service中的方法,但很多地方是需要这么做的.我觉得我的问题主要是在表现层事务也是可写的,我先试试把表现层事务改为只读,有什么问题再来请教
power1128
2008-05-07 10:33
晕,为什么我的回复有时候能看见,有时候看不见
OSIV模式
事务架构