美文网首页
service层不能加锁,可能会无效

service层不能加锁,可能会无效

作者: TinyThing | 来源:发表于2019-02-15 14:03 被阅读0次

    因为spring的事务是通过AOP实现的,因此在service中加锁,锁在事务内部开启的,放锁后,事务可能还没提交;

    //伪代码
    method() {
        beginTransaction();
        try {   
            //你的锁是被代理方法里加的
           targetMethod.invoke();
           commit();
        } catch (e) {
           rollback();   
        }
    }
    

    在高并发情况下,这个锁其实是无效的。
    例如:

    //伪代码
    begin transaction;
    
    synchronized {
        //检查name是否存在
        boolean exist = checkExist(name);
        //如果那么已存在,返回
        if (exist) return;
        //如果name不存在,插入数据库
        insert(name);
    }
    commit;
    

    以上的代码,在高并发情况下,例如两个线程A和B同时执行:

    A线程开启事务,将要插入name="张三";
    B线程开启事务,也要插入name="张三";
    A线程获取锁,B线程阻塞等待锁;
    A线程检查name="张三"不存在,执行插入数据库操作;
    A线程释放锁,B线程拿到锁;
    此时B线程查询"张三"也不存在(因为A还未提交事务);
    B线程也插入了一条"张三";
    A提交事务;
    B提交事务;

    至此,会发现数据库有两个张三!

    相关文章

      网友评论

          本文标题:service层不能加锁,可能会无效

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