zoukankan      html  css  js  c++  java
  • hibernate并发时的事务处理

    两个方法

    方法一:
    public void saveTest() {
    try {
    System.out.println("saveTest start");
    User user = entityDao.get(User.class, 1L);
    // User user = entityDao.getTemplate().get(User.class, 1L, LockMode.READ);
    System.out.println("saveTest " + user.getMail());
    try {
    Thread.sleep(10000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    user.setMail("test@qq.com");
    entityDao.getTemplate().saveOrUpdate(user);
    System.out.println("saveTest " + user.getMail());
    System.out.println("saveTest end");
    } catch (Exception e) {
    e.printStackTrace();
    }
    }

    方法二:

    public void saveTest2() {
    try {
    System.out.println("saveTest2 start");
    User user = entityDao.get(User.class, 1L);
    // User user = entityDao.getTemplate().get(User.class, 1L, LockMode.READ);
    System.out.println("saveTest2 " + user.getMail());
    try {
    Thread.sleep(5000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    user.setMail("test2@qq.com");
    entityDao.getTemplate().saveOrUpdate(user);
    System.out.println("saveTest2 " + user.getMail());
    System.out.println("saveTest2 end");
    } catch (Exception e) {
    e.printStackTrace();
    }

    声明式事务的弊端。事务会自动提交。无法有效对不同线程的事务进行阻塞。方法1中先查询出结果,但是保存在后,期间方法二做出查询和保存操作。这样两个线程独立操作互不影响。有个比较奇葩的现象:如果方法一种的查询出的结果和set方法设置的结果一致。那么hibernate不对发送update语句。及时此时数据库的实际数据已经发生变化,对hibernate而言。它并不知道。所以他做出的判断是:如果set前后的值相同,将不会发送sql。

    搜集资料时看到有人提出。并发量较高时使用Queue来作为一个缓冲池,集中进行插入更新操作,感觉是个不错的想法。只是如果做了负载均衡呢?

  • 相关阅读:
    趣题:寻找出现了奇数次的数
    zstu2016校赛圣杯战争
    HDU 5183 Negative and Positive (NP) ——(后缀和+手写hash表)
    HDU 5673 Robot ——(卡特兰数)
    HDU 3775 Chain Code ——(Pick定理)
    2016 ICPC北京站现场赛总结(再度流水账)
    2014苏州大学新生赛第二场(12.10)题目解析
    【Jump Game II 】cpp
    【Jump Game】cpp
    【 Sqrt(x) 】cpp
  • 原文地址:https://www.cnblogs.com/wanglonghai/p/4546330.html
Copyright © 2011-2022 走看看