• 事务的隔离级别,乐观锁,悲观锁


    事务是有隔离级别

    read uncommited (读未提交):不做任何隔离,具有脏读,不可重复对,幻读的问题

    read committed (读提交):可以防止脏读,不能防止不可重复读和幻读的问题

    repeated read(可重复读):可以防止脏读,不可重复读,不能防止幻读(mysql的默认隔离级别)

    serializable(串行化):数据库运行为串行,以上问题都可以防止,但是性能低

    下面的解释都用这个user表

    name age
    jason 38

    脏读(a,b同时开始事务,a,b再事务,没有哪一个结束,只有两个都进入事务后,才能结束期中一个事务,两个事务都是存活的)

    1 a  开启事务  将jason的年龄改成 18岁,但是没有提交事务
    2 b  开始事务  读取jason的年龄,发现是18岁。
    
    上述的问题,
    假设a事务回滚,b事务使用的数据就是错误的,就导致程序数据不正确。
    

    不可重复度(a,b同时开始事务,a,b再事务,没有哪一个结束,只有两个都进入事务后,才能结束期中一个事务,两个事务都是存活的)

    1 a  开始事务  将jason的年龄改成18岁,但是提交了
    2 b  开启事务  读取jason的年龄就能读取a事务修改后的jason年龄18岁。
    

    可重复读(a,b同时开始事务,a,b再事务,没有哪一个结束,只有两个都进入事务后,才能结束期中一个事务,两个事务都是存活的)

    1 a  开始事务  将jason的年龄改成18岁,但是提交了
    2 b  开启事务  读取jason的年龄不能读取a事务修改后的jason年龄18岁。而是读取的是38岁
    

    幻读(a,b同时开始事务,a,b再事务,没有哪一个结束,只有两个都进入事务后,才能结束期中一个事务,两个事务都是存活的)

    #概念和不可重读有点像,不可重复度是站在修改的基础上,而幻读是站在新增的基础上
    1 a  开始事务  将所有的的年龄改成18岁
    2 b  开始事务  新增一条数据数据name=tank,age=19,而且提交了。
    3 a  重新查, 发现有一条数据 的age=19,这就是所谓的幻读。
    

    如何看msql的隔离级别

    select @@global.tx_isolation;
    

    如何修改事务的隔离级别

    #修改配置文件
    transaction-isolation=Read-Committed
    #修改后一定要重启数据库
    

    数据库的乐观锁与悲观锁(是建立再事务的基础上)

    悲观锁

    悲观锁的概念,他觉有人会修改我读的数据。那我就再查的时候,对数据进行锁定。
    
    select age from user where id=1 for update;
    比如 上面的查出来的 age =18 
    update age改成age = age+ 1
    如果该次查询走了索引,那就是行锁,如果没有走索引就是表锁。
    
    如何释放锁呢?结束事务就释放了锁。
    django中的orm是如果用悲观锁?
    user.objects.select_for_update().filter(id=1).first()
    

    乐观锁

    乐观锁的本质不是锁。他是通过代码来实现锁的。他觉的别人不会修改的他的数据。他觉得读数据不会背别人修改。最后再修改该条数据,再where条件中添加,之前查出来的数据。以保证数据的安全性
    select age from user where id=1 ;
    比如 上面的查出来的 age =18   
    20 
    update age改成age = age+ 1  ====》19
    
    乐观锁:
    update age改成age = age+ 1 where age =18 and id =1  ====》19
    如果我发现不是18,上面的影响行数是0
    
    #如果是可重复读,上面的乐观锁无效,必须改成read committed
    a update age改成age = age+ 1  ====》19 提交
    
    
    b select age from user where id=1; --->18
    
    update age改成age = age+ 1 where age =18 and id =1  ====》19  ---->数据已经被改
    
    
  • 相关阅读:
    MiniUI破解方法
    mysql [索引优化] -- in or替换为union all
    MySQL匹配指定字符串的查询
    MySQL优化之like关键字
    Java身份证归属地目录树
    JS数字指定长度不足前补零的实现
    jQuery Distpicker插件 省市区三级联动 动态赋值修改地址
    JS 正则表达式从地址中提取省市县
    Eclipse/myEclipse 代码提示/自动提示/自动完成设置
    Spring Mvc配置多视图
  • 原文地址:https://www.cnblogs.com/yafeng666/p/12515266.html
Copyright © 2020-2023  润新知