hibernate-session提交的问题

本文探讨在高并发环境下,如何通过优化事务传播策略和避免死锁问题,确保数据库操作的一致性和正确性。具体分析了在使用Spring声明式事务管理时遇到的事务同步和并发控制难题,并提出了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

事务传播:REQUIRED;

事务都是使用spring的声明式事务。

在项目中,要对一张表先进行查找,如果相同uri的数据存在就更新改数据,如果不存在就添加一条记录。

查操作

if(==1)

{update}

else

{add}

很简单的一个需求,当在高并发的情况下(写了一个线程池,6个核心线程、最大10个),相同uri就会出现多条记录。

可能哥们会说没同步,最初为了性能我使用的lock,发现不行,后来干脆使用synchronized将整个操作(查、添加、更新)都同步到一个方法中,发现还是不行。

断点跟踪(空表),发现在多余6个线程并发的情况下,第一个个线程在执行同uri查操作记录为0,ADD后,

第二个线程查操作记录还是为0........这就是问题的根源,按理来说应该为1.

 

我想:大概是hibernate自己管理hql没有同步到数据库,于是使用session.flush(),发现不行。

难道还没有同步:于是session.flush();再session.clear();结果还是悲剧!

 

在此我只能出绝招了:

session.setAutoCommit(false);

add()
session.commit();

session.setAutoCommit(true);

 

这样倒是可以。但是感觉很别扭。

不过长时间操作,会出错!这个是关键。有时hibernate在同步session会报异常。

 

于是我有想:

Connection conn = session.getConnection();

PreparedStatement ps = conn.PreparedStatement(sql);

ps.executeUpdate();

conn.commit();

session.flush();(安全起见,不过好像提交了就没必要了哈!)

ps.close;

conn.close;

这样到也可以,但是感觉还是别扭!不大对劲。

 

希望大侠们指点迷津啊,框架的东西没怎么看,不大懂啊!

 

在项目中大并发的情况下,有张表老是报死锁,发现对这张表同时有hql、sql操作。

偶然把sql改成hql居然没发现死锁了(可能也是偶然);

这个问题大家也给点意见。

头痛啊。。。。。。。。。。。书到用时方恨少啊!!

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值