当前位置: 代码迷 >> J2EE >> SSH2的事务有关问题
  详细解决方案

SSH2的事务有关问题

热度:488   发布时间:2016-04-22 03:45:21.0
SSH2的事务问题
把hibernate交给spring托管,在service一个方法里要保存(或其他操作比如删除,更新)两个(甚至多个)对象,如果其中任何一个操作出现异常,则全部回滚。。这其实是一个老生常谈的问题,不需要我过多描述,都能明白我的意思吧?但是我没写过。。求高人指点,最好贴代码啊大虾。。。

------解决方案--------------------
伪代码:

service 方法:
void 注册新生() {
添加新生基本信息();//这是对新生表的一个添加操作
添加新生班级信息();//这是对新生班级表的添加操作
添加学生交费信息();//这是对学生交费表的添加操作
更新班级信息();//这是对班级表的更新操作
}

在以上的4个方法中,比如最后一个方法《更新班级信息》方法中出现了异常,即报错,那么在之前的
《添加新生基本信息》,《添加新生班级信息》,《添加学生交费信息》里添加的数据都会回滚,即相当于没有添加过数据一样。

这就是事务回滚,一句话,要么全部成功,要么全部失败。
------解决方案--------------------
你的spring怎么配置的?
------解决方案--------------------
在Spring配置文件中配置,在给这几个方法加事物的时候控制,这个涉及到事物嵌套问题,用事物的那几个特性处理(好像什么REQUIRED),在具体的我也忘了
------解决方案--------------------
看配置好像没有问题啊,

你的数据表的引擎是什么? 只有InnoDB才支持事务的。
------解决方案--------------------
我感觉也无什么问题
但你的service层有做代码异常处理,是spring捕获不了,默认只对unchecked exception异常做处理,你在配置文件中该的试下
<tx:method name="save*" propagation="REQUIRED" rollback-for="Throwable"/>
------解决方案--------------------
1。如楼上说的,加上一个rollback-for
2。你用的是mysql吗? 用工具看嘛,设计表,在选项那里有引擎,如果你是用sql创建表的,在后面有没有加上Engine 的话, mysql默认会采用 Sam 引擎,他是不支持事务的。具体的,你可以去Google
  相关解决方案