美文网首页
springboot 的事务与锁

springboot 的事务与锁

作者: Eric鑫 | 来源:发表于2018-08-13 00:42 被阅读0次

最近有一个需求,需要在事务的基础上增加锁,实现同步,过程中使用到了springboot的注解和synchronized,但是结果是同步成功,事务失败了

@Transactional
  public void addUser(){
        UserDO user = userDao.selectUser("eric");
        if(user == null){
            System.out.println("未找到用户,重新创建");
            synchronized (this.getClass()) {
                System.out.println("进入同步逻辑");
                System.out.println("重新检查user是否存在");
                UserDO user2 = userDao.selectUser("eric");
                if(user2 != null){
                    System.out.println("user已经存在,返回");
                    return;
                }else {
                    System.out.println("第二次,未找到user");
                }
                UserDO userDO = new UserDO();
                userDO.setName("eric");
                System.out.println("add user");
                userDao.insertUser(userDO.getName());
                System.out.println("创建成功");
            }
        }else{
            System.out.println("第一步找到用户,返回");
        }

    }

执行结果如下:

未找到用户,重新创建
进入同步逻辑
重新检查user是否存在
未找到用户,重新创建
未找到用户,重新创建
未找到用户,重新创建
未找到用户,重新创建
第二次,未找到user
add user
未找到用户,重新创建
未找到用户,重新创建
未找到用户,重新创建
未找到用户,重新创建
未找到用户,重新创建
创建成功
进入同步逻辑
重新检查user是否存在
第二次,未找到user
add user

这里是一个坑,由于在方法的外层加的事务,所以需要整个方法执行完才会提交,但是多线程情况下,第二次查找,很多情况下会查不到,因为第一次拿到锁的事务还没有提交

相关文章

  • springboot 的事务与锁

    最近有一个需求,需要在事务的基础上增加锁,实现同步,过程中使用到了springboot的注解和synchroniz...

  • [转]SQL Server中的事务与锁

    转自SQL Server中的事务与锁 了解事务和锁 事务:保持逻辑数据一致性与可恢复性,必不可少的利器。 锁:多用...

  • mysql锁

    共享锁与排他锁 共享锁(读锁):其他事务可以读,但不能写。 排他锁(写锁) :其他事务不能读取,也不能写。 粒度锁...

  • 65 事务的隔离级别 , 脏读 可重复读

    1MYISAMI 表锁与INNOdb 行锁之间的区别 2, Spring 中事务声明与编程事务之间的区别 3,...

  • 2019-03-18文章精选

    1.深入理解 MySQL ——锁、事务与并发控制 各种锁、事务与并发,写得很详细。 2.剖析分布式锁 redis部...

  • 高性能Mysql笔记

    一、Mysql架构与历史 1、架构图 2、锁 表锁 行级锁 3、事务 死锁 Mysql中的事务 1

  • 事务与锁

    事务、锁、同步的区别; 事务是数据库中的概念,包括ACID,其中I即isolation,隔离性,锁只是用来保证事务...

  • 锁与事务

    最近在写一个短链服务,提供两个API给用户使用,一个API用于生成短链,一个API用于根据短链获取长链接。 生成短...

  • 事务与锁

    多个事务的并发会出现以下几个问题: 1)脏读:事务A读取了一条记录的值,然后基于这个值做业务逻辑,在事务A提交之前...

  • 事务与锁

    样例:

网友评论

      本文标题:springboot 的事务与锁

      本文链接:https://www.haomeiwen.com/subject/yobebftx.html