Java里的并发事务

spring和jpa集成后,对于并发数据库操作的测试结果
测试方法:
    A进程,循环十万次,每次保存一个对象
    B进程,执行一次,读出同一个对象的列表,循环输出读到的对像
   两个进程都是一个junit 测试方法,A先执行,在A未执行完前启动B方法,让他们有机会同步执行
    两个测试方法,都调用service层的方法,service层方法,有两种测试,一种加事务,一种不加事务


1、若service上未加事务注解
     A进程在写数据的同时,只要save过的,在数据库里可以直接查到,同时B进程,可以拿到A进程刚插入的数据。 
    也就是说,在无事务时,可以读到“脏数据”
2、若service上加上事务注解
    A进程调用save保存的数据,事务未结束时,数据库里查不到,同时B进程里,也读不到A进程未结束事务前的数据
    也就是说,在有事务时,事务未结束前,读不到数据。 

事务的并发问题
    
    运行环境:先进行查询,若未查到数据,则启动事务,保存数据,保存操作涉及多个表和多步较耗时操作,保存操作
                    完成后,要返回保存结果给第三方。
                第三方是通过网络调用,在调用后,若长时间未收到响应,会再次调用保存操作,重复保存。

    可能出现的问题:事务并发,违反主键约束异常。
                在第一次查询时,数据库里没数据,启动事务进行保存,保存未完成时,第三方由于长时间未收到响应,启动第二次调用,由于上次的事务未结束,因此这次查不到已存的数据,
再次启动一个事务进行保存操作,比如,需要保存五个实体,当第三个实体正在保存时,第一个事务保存操作结束,第二个事务在保存同一个实体时,违反主键约束,报异常,第二次事务进行回滚。


数据脏读的并发
        
    运行环境:集群环境中,同样的无事务的保存操作,在两个服务器上定时执行,使用同一个数据库

    脏读的好处:任何一个服务器上的保存操作,在另一个服务器上可产即查出
    使用这种机制,可以控制集群服务器上的并发操作,比如,两台服务器同步的定时保存操作,保存前,可以先查一下数据是否
已存,只要任何一台服务器完成部分的保存操作,另一台就可立即查出,无须再作得复的保存操作。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值