hibernate mysql 多线程_多线程 – 处理长时间运行的Hibernate事务中的死锁

我有一个Hibernate应用程序可以产生并发插入和更新(通过Session.saveOrUpdate)到具有相同主键的记录,该主键被分配.这些事务有点长时间运行,平均可能是15秒(因为数据是从远程数据源收集的,并且在它进入时会持续存在).我的数据库隔离级别设置为Read Committed,我正在使用

MySQL和InnoDB.

问题是这种情况会导致过多的锁等待,这是由于死锁或长事务造成的.这引出了几个问题:

>数据库引擎是否仅在提交事务时释放其锁定?

>如果是这种情况,我是否应该缩短交易时间?

>如果是这样,使用单独的读写事务是一种好的做法,其中写入事务可以缩短并且仅在收集了所有数据之后发生(我的事务长度的大部分涉及收集远程数据).

编辑:

这是一个简单的测试,近似于我认为正在发生的事情.由于我正在处理长时间运行的事务,所以提交在第一次刷新后很久就会发生.所以为了说明我的情况,我离开了测试:

@Entity

static class Person {

@Id

Long id = Long.valueOf(1);

@Version

private int version;

}

@Test

public void updateTest() {

for (int i = 0; i < 5; i++) {

new Thread() {

public void run() {

Session s = sf.openSession();

Transaction t = s.beginTransaction();

Person p = new Person();

s.saveOrUpdate(p);

s.flush(); // Waits...

}

}.run();

}

}

以及期望产生的查询,等待第二个插入:

select id, version from person where id=?

insert into person (version, id) values (?, ?)

select id, version from person where id=?

insert into person (version, id) values (?, ?)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值