zoukankan      html  css  js  c++  java
  • 事务隔离性

    1. 脏读:未提交  读  read uncommit 事务A读取事务B未提交的数据

    事务A 读取事务B更新的数据, 然后事务B回滚,那么A读取到的数据就是脏数据:

    情景展示:

    1. 会话B 可提交读

    set SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
    
    BEGIN
    update account set balance = balance - 50 where id = 1

    2. 会话A 读取表数据

    set SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
    
    select * from account
    

      

    3. 此时会话A看到 id = 1的 balance = 350, 想要执行更新操作,350 - 50 =300

    update account set balance = balance - 50 where id = 1
    

    4. 在执行之前, 会话B 执行rollback 回滚了
    5.然后结果并没有改变

    2.已提交读:read COMMITTED:事务A 会读取到事务B已提交的数据

    1. 新建一个会话,会话设置为 read committed 已提交读,然后开启一个事务

    set SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED

    BEGIN

    执行更新语句:
    update account set balance = balance - 50 where id = 1

    2.新建一个会话,设置为已提交读,然后开启事务,查询表数据

    set SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED

    BEGIN

    select * from account


    读取到的数据仍然是400

    3. 可重复读 REPEATABLE READ
    可重复读和读已提交的效果很相似,
    二者的区别是什么:当会话提交后, 在另一个会话中,查询的数据不变

    原始数据

    1.开启一个会话, 设置会话级别,可重复读,然后开启事务,更新操作

    set SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ

    BEGIN

    update account set balance = balance - 50 where id = 1

    2.开启另一个会话,设置会话级别,可重复读,然后开启事务,执行查询操作

    set SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ

    BEGIN

    select * from account

    3.会话1 提交事务 commit, 然后会话1查询数据展示:

    4.会话2 查询数据展示:

    温故而知新
  • 相关阅读:
    flex布局
    redis持久化的四种方式
    list all index in elasticsearch
    Java Thread停止关闭
    关于线程的一些操作方法
    将redis key打印到文本
    spout和bolt
    java读取redis的timeout异常
    storm中,ack与fail
    好文要收藏(大数据)
  • 原文地址:https://www.cnblogs.com/Uzai/p/11222821.html
Copyright © 2011-2022 走看看