通俗理解事务隔离界别

    xiaoxiao2021-03-25  152

    数据库事务隔离级别有四种, 由低到高有Read uncommitted, read committed, repeatable read, serializable , 而且事务并发操作中可能会出现脏读, 不可重复读, 幻读 .

    Read unCommitted 读未提交, 就是一个事务可以读取另一个事务未提交的数据 . 事例 : 老板要给程序员发工资, 程序员工资是3.6万/月, 但是发工资时老板一不小心按错了数字, 变成3.9万/月, 该钱打到程序员账户, 但是事务没有提交, 就在这时, 程序员查看自己工资比以前多了3千块, 因为涨工资了很高兴, 但是老板即使发现不对, 马上回滚事务, 将数字变为3.6再提交 . 分析 : 实际上程序员工资还是3.6万每月, 但是程序员看到还是3.9万, 他看到的是老板还没有提交事务的数据, 这就是脏读 . 如何解决脏读? Read committed ! 读提交, 能解决脏读问题 .

    Read committed 读提交, 就是一个事务要等另一个事务提交后才能读取数据 . 事例 : 程序员拿着信用卡去消费, 卡里只有3.6万元, 当他买单(程序员事务启动) , 收费系统发现他的卡里还有3.6万元, 就在这个时候, 程序员妻子把钱全部转出充家用, 并提交 . 当收费系统准备扣款时候, 检测卡里的金额, 发现已经没有钱了(第二次检测金额要等到妻子转出金额事务提交之后) . 程序员很郁闷, 明明卡里还有钱呢 . .. 分析 : 读提交, 如果有事务对数据更新(UPDATE)操作, 读操作事务要等到这个更新操作事务提交后才能读取数据, 可以解决脏读问题. 但是这个事例中, 出现了一个事务范围内出现两次相同查询却返回不同数据, 这就是不可重复读 . 如何解决不可重复读问题,? Repeatable read !

    Repeatable read 重复读, 就是开始读取数据(开启事务), 不允许其他修改操作 . 事例 : 程序员拿着信用卡享受生活(卡里只有3.6万), 当他买单(事务开启, 不允许其他事务的UPDATE修改操作), 收费系统事先检测他卡里有3.6万, 这个时候他的妻子就不能转出金额, 接下来收费系统就可以进行扣款 . 分析 : 重复读可以解决不可重复读问题, 不可重复读对应是修改, 即UPDATE操作, 但是还是会出现幻读, 因为幻读问题对应的是INSERT操作, 而不是update操作 . 什么时候出现幻读 ? 事例 : 程序员某天霞飞, 花了2千元, 然后他的妻子查看他今天的消费记录(全表扫描, 事务开启), 看到确实花了2千元, 就这个时候程序员花了1万元买了一部电脑, 就是新增INSERT了一条消费记录, 并提交. 当妻子打印程序员消费记录清单(事务已经提交), 发现花了1.2万元, 似乎出现幻觉, 这就是幻读 . 如何解决幻读问题, Serializable

    Serializable 序列化 Serializable是最高的事务隔离级别, 该级别下, 事务串行化顺序执行, 可以避免脏读, 不可重复读和幻读. 但是这种事务隔离级别底下, 比较耗性能, 一般不使用 .


    大多数数据库隔离级别是 Read committed, 比如Oracle, mysql隔离级别是Reapeatable read


    转载 : http://blog.csdn.net/qq_33290787/article/details/51924963

    转载请注明原文地址: https://ju.6miu.com/read-1530.html

    最新回复(0)