Hibernate批量操作的事物问题,相当奇怪,大侠请进

雨雪飘零 2009-07-02 06:16:21
环境 : MySql

操作 : 批量新增

要求 : 如果其中一笔数据出现错误,掠过这一笔,继续新增下一笔数据。
例 : 共有 5 笔数据,其中第3笔出现错误,不能新增到DB, 那么继续处理后面的 2 笔,最后新增到DB中的数据
应该有 4 笔(第1,2,4,5笔)。

使用以下代码,最后DB中一笔数据也没有


// method start

Transaction tx = this.session.beginTransaction();

for (int i = 0; i < list.size(); i++) {
try {
this.session.saveOrUpdate(list.get(i));
}
catch (HibernateException e) {

}
}

tx.commit();

// method end


后又改了一下代码,还是不行。出错那笔数据以前新增的,可以成功,但是以后的全都不能新增
即 : 共有 5 笔, 第 3 笔出错,DB 中只能新增第1,2笔,第3,4,5笔都不行

// method start
for (int i = 0; i < list.size(); i++) {
try {
Transaction tx = this.session.beginTransaction();

this.session.saveOrUpdate(list.get(i));

tx.commit();
}
catch (HibernateException e) {
// ~~~
}
}
// method end


那位大侠可以解决,不胜感激!
...全文
167 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
frdgo 2009-07-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ligaoyang 的回复:]
引用 1 楼 java2000_net 的回复:
this.session.saveOrUpdate(list.get(i));

你为何不把这一行放到一个单独的try/catch里面呢。这样除了异常,就不至于退出循环了!



现在这样的代码出了异常也不会退出循环啊
[/Quote]
???
抛出异常后,并catch后,程序不就在抛出的点终止了么?
zjwfisheep 2009-07-03
  • 打赏
  • 举报
回复
for (int i = 0; i < list.size(); i++) {
try {
this.session.saveOrUpdate(list.get(i));
tx.commit();//如果不用这句话要把session变成自动提交
}
catch (HibernateException e) {

}
}

你的问题似乎和事务没有关系。把事务去掉试试。
因为你这个批处理不要保证数据的事务的原子性(当有一条记录错误时,直接过,接着往下走)。
zjwfisheep 2009-07-03
  • 打赏
  • 举报
回复
for (int i = 0; i < list.size(); i++) {
try {
this.session.saveOrUpdate(list.get(i));
tx.commit();//如果不用这句话要把session变成自动提交
}
catch (HibernateException e) {

}
}

txf_7337 2009-07-03
  • 打赏
  • 举报
回复

Transaction tx = session.getTransaction();
for (int i = 0; i < list.size(); i++) {
try {
tx.begin();

this.session.saveOrUpdate(list.get(i));

tx.commit();
}
catch (HibernateException e) {
tx.rollback();
}
finally{
tx = session.getTransaction();
}
}

不知道行不行。。。
zjwfisheep 2009-07-03
  • 打赏
  • 举报
回复
这个问题似乎不用事务就可以了,反正你也要不要保证这批数据的原子性。
雨雪飘零 2009-07-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 frdgo 的回复:]
引用 4 楼 ligaoyang 的回复:
引用 1 楼 java2000_net 的回复:
this.session.saveOrUpdate(list.get(i));

你为何不把这一行放到一个单独的try/catch里面呢。这样除了异常,就不至于退出循环了!


现在这样的代码出了异常也不会退出循环啊


???
抛出异常后,并catch后,程序不就在抛出的点终止了么?
[/Quote]

如果异常被 Catch 住,则 Catch 以后的代码依然会执行,但是从出错点到Catch之间的代码不会执行。
就此代码而言,异常被Catch住后,会继续执行 Catch 一下的代码,但是 Catch 一下已经没有代码了,
所以会继续执行下一次循环。
雨雪飘零 2009-07-03
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 Landor2004 的回复:]
出错之后,当前事务既没提交也没回滚,数据库一直等待超时,你可以这么修改


Java code// method start
for (int i = 0; i < list.size(); i++) {
try {
Transaction tx = this.session.beginTransaction();

this.session.saveOrUpdate(list.get(i));

tx.commit();
}
catch (HibernateException e) {
tx.rollback();
// ~~~

[/Quote]

经测试,依然不行。 哎~~~~
zm_hs 2009-07-03
  • 打赏
  • 举报
回复
关注一下! 不能把5笔数据分成5部分吗?
txf_7337 2009-07-03
  • 打赏
  • 举报
回复
开启5个事务,每笔数据都不会影响,LZ想想行的通不?
如果交给SPRING控制事务,那就简单多了。。。
Landor2004 2009-07-03
  • 打赏
  • 举报
回复
出错之后,当前事务既没提交也没回滚,数据库一直等待超时,你可以这么修改

// method start
for (int i = 0; i < list.size(); i++) {
try {
Transaction tx = this.session.beginTransaction();

this.session.saveOrUpdate(list.get(i));

tx.commit();
}
catch (HibernateException e) {
tx.rollback();
// ~~~
}
}
// method en
liudejie 2009-07-03
  • 打赏
  • 举报
回复
// method start
for (int i = 0; i < list.size(); i++) {
try {
Transaction tx = this.session.beginTransaction();

this.session.saveOrUpdate(list.get(i));

tx.commit();
}
catch (HibernateException e) {
if(tx!=null){
tx.rollback();
}
// ~~~
}finally{
if(session!=null){
session.close();
}
}
}
// method en
看看这样行不
laynepeng 2009-07-02
  • 打赏
  • 举报
回复
不熟,N长时间没Hibernate了,也没有环境测试。但是,我建议你第二种的时候,加个finally把tx关掉,并置为null,再试试。。。。

否则,你的this.session一直是出错状态。

我猜的。。。
雨雪飘零 2009-07-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 huhaibo777 的回复:]
sorry,没看清题目
[/Quote]

不用 sorry, 你帮我想个办法就行了, 哈~
雨雪飘零 2009-07-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 java2000_net 的回复:]
this.session.saveOrUpdate(list.get(i));

你为何不把这一行放到一个单独的try/catch里面呢。这样除了异常,就不至于退出循环了!
[/Quote]

现在这样的代码出了异常也不会退出循环啊
huhaibo777 2009-07-02
  • 打赏
  • 举报
回复
sorry,没看清题目
huhaibo777 2009-07-02
  • 打赏
  • 举报
回复
你那个list是可以批量更新的,这样做你累不累。
还有,你后改的那个方法极不可取,自己玩玩还可以。
老紫竹 2009-07-02
  • 打赏
  • 举报
回复
this.session.saveOrUpdate(list.get(i));

你为何不把这一行放到一个单独的try/catch里面呢。这样除了异常,就不至于退出循环了!
内容概要:本文围绕“基于杜鹃优化算法分时电价的综合能源系统双层协同调度研究”展开,结合Matlab代码实现,提出了一种融合杜鹃优化算法(Cuckoo Search Algorithm)与分时电价机制的综合能源系统双层协同优化调度模型。研究旨在通过需求响应机制优化能源资源配置,实现系统运行成本最小化与低碳化运行的双重目标。模型充分考虑了氢能、氨气等新型清洁能源的集成利用,体现了较强的创新性与前瞻性。研究内容涵盖综合能源系统建模、双层优化架构设计、多目标协同调度策略及智能算法求解全过程,并附有大量相关研究方向拓展,如储能选址定容、微电网调度、虚拟电厂优化、多目标智能优化算法应用等,展现出广泛的学术与工程应用价值。; 适合人群:具备电力系统、优化理论、能源管理及Matlab/Simulink编程基础的研究生、科研人员和工程技术人员,特别适合从事综合能源系统、需求响应、智能优化算法、低碳调度等方向研究的专业人士。; 使用场景及目标:① 为科研人员提供基于杜鹃优化算法的综合能源系统双层调度模型构建与仿真方法;② 探索分时电价与需求响应机制下,含氢能、氨气等新型能源的综合能源系统协同优化运行策略;③ 为解决储能配置、微电网经济调度、碳交易机制等实际工程问题提供算法支持与代码参考; 其他说明:该研究成果属于“创新未发表”类别,突出算法的原创性与实践指导意义,可通过提供的网盘链接获取完整资源,建议读者结合文中列举的多种优化算法与应用场景进行深入学习与拓展研究。

67,536

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧