@Transactional和锁导致的问题

@Transactional事务中使用锁失效
说明:
Spring中使用注解@Transactional作事务管理,@Transactional注解在方法上时,是方法完成之后才进行提交事务的,这就会导致锁失效,因为给方法加加锁后,当方法执行完后并不会立即提交事务,在事务还没提交的过程中其他线程取操作数据时仍然是未提交的数据,导致锁失效

	@RequestMapping("/add")
    public void addEmploye(){
        for (int i=0;i<1000;i++){
            new Thread(() -> 	detailService.addEmployee()).start();
        }
    }
    @Transactional
    public synchronized void addEmployee() {
        Employee employee = employeeRepository.getOne(8);
        System.out.println(employee);
        Integer age = employee.getAge();
        employee.setAge(age + 1);
		//修改id =8 的employee的年龄+1
        employeeRepository.update(employee);
    }

坑:使用@Transactional注解开启事务管理,假如线程一调用addEmployee获取锁调用addEmployee()方法之后但这时还未提交事务,数据库中id =8 该条记录还未有做更新,线程一释放锁,线程二获取到锁调用完方法之后和线程一恰好一起提交事务,此时可能会造成数据库表被锁(或死锁),出现异常之后由于使用@Transactional事务会造成线程一和线程二都没有修改到数据库记录
注意:无论是使用synchronized 作锁或是使用redis作锁都会有可能这种情况发生,在事务中使用锁无效!!!

    @RequestMapping("/add")
    public void addEmploye(){
        for (int i=0;i<1000;i++){
            new Thread(() -> 	detailService.add()).start();
        }
    }
    public synchronized  void add(){ // 解决事务中使用锁失效
    	addEmployee()
    }
    @Transactional
    public void addEmployee() {
        Employee employee = employeeRepository.getOne(8);
        System.out.println(employee);
        Integer age = employee.getAge();
        employee.setAge(age + 1);
		//修改id =8 的employee的年龄+1
        employeeRepository.update(employee);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值