博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring 事务隔离级别 Isolation.SERIALIZABLE) 实验总结
阅读量:6834 次
发布时间:2019-06-26

本文共 2646 字,大约阅读时间需要 8 分钟。

hot3.png

一、模拟问题:同一个用户连续点击保存按钮,造成保存重复问题。(第二次请求,查询时,第一次还没有保存到数据库)

 

@Transactional

public class TestUserImpl implements TestUserService {

 

    public void saveUserAll(int  userId) {

        //1、判断是否已经存在

        boolean result = this.getUser(userId);

        try {

            Thread.sleep(15000);

        } catch (Exception e) {

            e.printStackTrace();

        }

        //2、不存在,保存

        if (result) {this.saveUser(userId);}else{System.out.println("用户已经存在userId="+userId);}

    }

    @Transactional(isolation = Isolation.SERIALIZABLE)

    public void saveUser(int userId) {

        System.out.println("开始保存----userId="+userId);

        User user= new User();

        user.setUserId(userId);

        userDao.save(user);

        System.out.println("完成保存----userId="+userId);

    }

 

    public boolean getUser(int userId) {

        System.out.println("查询----userId="+userId);

        String sql = "SELECT id from  user where userId="+userId+"";

        List list = userDao.findBysql(sql);

        if (list.size() > 0) {

            return false;

        } else {

            return true;

        }

    }

}

------------------------输出结果------------------------------

查询----userId=1

查询----userId=1

开始保存----userId=1

完成保存----userId=1

开始保存----userId=1

完成保存----userId=1

---------------------解决办法:在saveUserAll方法上加锁synchronized----------------------

    public  synchronized void saveUserAll(int  userId)

-----------------------------------------------------------------------------------------------------------------------

二、在saveUserAll上加SERIALIZABLE,同意用户连续点击或不同用户并发请求时,造成死锁

@Transactional

public class TestUserImpl implements TestUserService {

    @Transactional(isolation = Isolation.SERIALIZABLE)

    public void saveUserAll(int  userId) {

        //1、判断是否已经存在

        boolean result = this.getUser(userId);

        try {

            Thread.sleep(15000);

        } catch (Exception e) {

            e.printStackTrace();

        }

        //2、不存在,保存

        if (result) {this.saveUser(userId);}else{System.out.println("用户已经存在userId="+userId);}

    }

   

    public void saveUser(int userId) {

        System.out.println("开始保存----userId="+userId);

        User user= new User();

        user.setUserId(userId);

        userDao.save(user);

        System.out.println("完成保存----userId="+userId);

    }

 

    public boolean getUser(int userId) {

        System.out.println("查询----userId="+userId);

        String sql = "SELECT id from  user where userId="+userId+"";

        List list = userDao.findBysql(sql);

        if (list.size() > 0) {

            return false;

        } else {

            return true;

        }

    }

}

------------------------输出结果----------------------------------------------------------------------

查询----userId=1

查询----userId=2

开始保存----userId=1

开始保存----userId=2

成功保存----userId=1

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction

----------------------------------------------------------------------------------------------------------------------

转载于:https://my.oschina.net/lsl1991/blog/670030

你可能感兴趣的文章
Promise
查看>>
CSS字体大小: em与px、pt、百分比之间的对比
查看>>
【更新】3D造型引擎3D ACIS Modeling 发布2018.1.0版本
查看>>
maven私服deploy时报Return code is: 401, ReasonPhrase: Unauthorized
查看>>
一般人不告诉的精通linux系统秘籍
查看>>
JVM内存管理、JVM垃圾回收机制、新生代、老年代以及永久代
查看>>
Solr学习笔记
查看>>
Thread类的使用
查看>>
高并发和分布式中的幂等处理
查看>>
盘点当前最流行的5个前端框架
查看>>
我理解的Java并发基础(三):线程安全与锁
查看>>
UX设计师——如何快速提高你的设计水平
查看>>
原型设计工具Mockplus新年福利,见者有份
查看>>
并发----AQS
查看>>
.Net MVC 用 ajaxfileupload 上传图片
查看>>
阿里云双十一1折拼团活动:已满6人,都是最低折扣了
查看>>
AngularDart4.0 指南
查看>>
js 入门 前端基础之JavaScript
查看>>
Java算法-递推算法思想
查看>>
rust学习记录-控制台整数读取
查看>>