zoukankan      html  css  js  c++  java
  • 数据库学习(四)——事务处理(脏读、不可重复读、幻读全在这篇了)

    数据库学习(四)——事务处理

    @

    一、事务简介

    1.正常的commit,自动提交
    commit;
    
    2.rollback
    delete from xxx where xx;
    delete from xxx where xx;
    savepoint sp1;
    delete from xxx where xx;
    rollback to sp1;
    
    3.事务的ACID特性
    A:原子性,操作集合不可分割
    C:一致性,经过N个操作,数据状态不会改变
    I:隔离性,隔离性会导致效率降低,为了提高程序效率,可以设置隔离级别
    隔离级别:读未提交,读已提交,可重复度,序列化
    数据不一致问题:脏读、不可重复读、幻读
    D:持久性,所有数据修改持久化到介质中,不会因为程序关闭,导致丢失
    
    4.事务的特性中,哪个是最关键的?

    所有特性,都是为了保证一致性,一致性是最终的追求。

    一致性是通过原子性,隔离性,持久性保证的。

    5.锁的机制:

    为了解决并发访问,数据不一致,加锁得考虑粒度,

    锁的粒度越小,效率越高,粒度越大,效率越低,大部分都是行级锁

    二、脏读、幻读、不可重复读测试

    1.打开命令行
    select @@autocommit
    set autocommit=0
    
    2.数据准备
    create database tran;
    use tran;
    create table psn(id int primary key,name varchar(10)) engine=innodb;
    insert into psn values(1,"zhangsan");
    insert into psn values(2,"lisi");
    insert into psn values(3,"wangwu");
    commit;
    
    3.测试事务
    --事务包含四个隔离级别:(从上往下隔离级别越来越高
    read uncommitted; --读未提交
    read commited; --读已提交
    repeatable read; --可重复读
    (seriable) --序列化执行,串行
    
    4.测试1:模拟读未提交产生脏读
    set session transaction isolation level read uncommitted;
    A:start transaction;
    B:start transaction;
    A:select * from psn;
    B:select * from psn;
    
    A:update psn set name='msb'
    --读取结果为msb,产生脏读,因为A事务没有commit
    
    A:commit
    B:select * from psn;
    --此时读取的数据是msb,正常读取
    

    这时候,我们两个表进行比较,发现,数据不一致了,产生脏读现象

    5.测试2:模拟不可重复读
    set session transaction isolation level read committed;
    A:start transaction;
    B:start transaction;
    A:update psn set name='ppp'
    B:select * from psn;
    A:commit;
    B:select * from psn;
    

    这时候用AB进行查询,发现脏读没有了,但是出现不可重复读,因为在一次事务中,B读出了2个不一样的数据

    6.测试3:模拟幻读
    set session transaction isolation level repeatable read;
    A:start transaction;
    B:start transaction;
    A:update psn set name='lisi'
    B:select * from psn;
    A:commit;
    B:select * from psn;
    

    这是候已经提交,但是B产生幻觉,还是之前数据,所以称为幻读。

    7.总结表
    隔离级别 异常情况
    读未提交 脏读,重复读,幻读
    读已提交 重复读,幻读
    不可重复读 幻读
    序列化
  • 相关阅读:
    [数学]如何旋转曲线
    19_04_25校内训练[最小割]
    第二类斯特林数总结
    19_04_19校内训练[Game]
    kd-tree题目总结
    [HNOI2019]校园旅行
    LCT模板(无讲解)
    min_25筛题目总结
    Miller Robbin测试模板(无讲解)
    19_04_02校内训练[图染色]
  • 原文地址:https://www.cnblogs.com/littlepage/p/11791644.html
Copyright © 2011-2022 走看看