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("[email protected]");
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("[email protected]");
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来作为一个缓冲池,集中进行插入更新操作,感觉是个不错的想法。只是如果做了负载均衡呢?

时间: 2024-10-10 19:48:20

hibernate并发时的事务处理的相关文章

多并发时支付如何保持账户余额的一致性?

转载:http://costlend.com/2016/03/14/dispatch-pay-balance-keep-consistence/ 不管是电商,还是O2O业务都会涉及到支付,而且多速情况下流量比较大,尤其是在做活动的时候.一般支付系统主要有充值,扣费,提现,转账等功能,那么在有些业务场景下,尤其是多并发的情况下,我们在做扣费业务操作时该怎样去保持账户余额的一致呢? Java开发人员可能第一个想法就是在调用扣减的DAO的方法上加上一个synchronized关键字,这个解决办法在单节

hibernate+mysql时,会出现事物不管用

hibernate+mysql时,会出现事物不管用(transation.rollback();没效果,数据在session.flush后直接进行了数据库操作) 很可能出现的问题是在mysql上..., 在/etc/my.cnf中[mysqld]下加上default-storage-engine=InnoDB ,效果是使用InnoDB引擎 show engines;命令可以查看当前使用的是什么数据库引擎

LNMP高并发时502

之前php-fpm配置: 单个php-fpm实例,使用socket方式,内存8G 静态方式,启动php-fpm进程数300,具体参数如下 1 2 3 4 5 6 7 8 9 10 11 listen = /tmp/php-cgi.sock #listen = 127.0.0.1:9000 listen.backlog = 2048 listen.allowed_clients = 127.0.0.1 pm = static pm.max_children = 300 pm.start_serve

如何面对你—LNMP高并发时502

问题:最近的抢购有点火,到点抢购的时候网站就会出现502错误 顶不住消费者的压力. 伤..... 之前php-fpm配置: 单个php-fpm实例,使用socket方式,内存8G 静态方式,启动php-fpm进程数300,具体参数如下 listen = /tmp/php-cgi.sock #listen = 127.0.0.1:9000 listen.backlog = 2048 listen.allowed_clients = 127.0.0.1 pm = static pm.max_chil

[转]你如何面对—LNMP高并发时502

From : http://www.topthink.com/topic/5683.html 之前php-fpm配置: 单个php-fpm实例,使用socket方式,内存8G 静态方式,启动php-fpm进程数300,具体参数如下 listen = /tmp/php-cgi.sock #listen = 127.0.0.1:9000 listen.backlog = 2048 listen.allowed_clients = 127.0.0.1 pm = static pm.max_childr

qt容器在并发时需要注意的地方

最近用tbb和qt写了一个延时摄影后期控制镜头的工具,主要就是扫描目录下所有图片,按照给定参数截取图片中某区域并另存,模拟镜头摆动. 扫描后的图片路径保存在qlist内,作为只读数据,交由tbb的parellel_for处理.tbb并行对qlist每个元素内的路径对应的图片进行读取,裁剪,另存操作(磁盘是ssd,这个程序在8线程的机器上,可令cpu满负荷).理想是美好的,现实是残酷的. 前提,qlist(不光qlist了,qt很多数据结构都)实现了copy on write,qlist的索引操作

关于数据库与Hibernate匹配时的小问题

今天做了一个小程序,jsp输入一些字段,action中将这些字段放到list中,然后从数据库get到那列数据,同样放到另一个list中,然后进行值相等的判断,就是这么简单的一个程序.但因为很久没碰Hibernate了,所以执行起来有些坎坷.列出如下问题: 空指针异常频发,这是因为在vo类中,没有指定与数据库列的映射: 关键字问题:我之前设定的列名有叫values的,但一直不通过,最后发现问题所在. 关于list的空指针问题,这个是发生比较多的.一个是没有实例化,这是基础知识的问题.第二个我觉得也

ecshop 秒杀并发时库存会被减到小于0的解决办法

ecshop 秒杀并发时库存会被减到小于0更新库存后,再进行库存检查,如果库存为负数,则执行事务的回滚. begin();//开始一个事物处理开始 $sql = "UPDATE ".$GLOBALS['a']->table('seconds_kill')." SET kill_stock = kill_stock - 1 WHERE sk_id='".$sk_id."' LIMIT 1" ; $GLOBALS['db']->query

FluorineFx 播放FLV 时堆棧溢出解决 FluorineFx NetStream.play 并发时,无法全部连接成功的解决办法

http://25swf.blogbus.com/tag/FluorineFx/ FluorineFx NetStream.play 并发时,无法全部连接成功的解决办法 在FLASH里,假如在一个方法里,同事使用几个不同的NetStream.play 一个相同的标识,会发现只有一个能正常播放. 进行以下修改 RtmpConnection.cs 里的NewPlaylistSubscriberStream 方法if (streamId < StreamId)        return null;改