zoukankan      html  css  js  c++  java
  • 面试外排中国移动的数据库问题整理

            昨天上午去中国移动面试,首先让做了一份智力题。。。。。,真是无力吐槽了,真正面试是是三个面试官,一个是项目负责人,另外两个是技术组长,他们主要针对你的项目问问题,问的很蛋疼,问题就是针对,要是如果登录成功以后使用某种会员功能,如何校验,说的很明白会根据登录成功后的数据库用户信息去判断。就盯着你的项目问,还问你数据库几个什么表,怎么做表的。

          具体有点意义的问题就是

           1.数据库事务

           事务的隔离级别(Isolation Level)

        • read uncommitted 读未提交
          事务A和事务B,事务A未提交的数据,事务B可以读取,这里读取到的数据叫做“脏数据”,该级别最低,一般只是理论上存在,数据库的默认隔离级别都高于该级别。
        • read committed 读已提交
          事务A和事务B,事务A提交的数据,事务B才可读取到,换句话说:对方事务提交之后的数据,当前事务才可读取到,可以避免读取“脏数据”,但是改级别会有“不可重复读”的问题,事务B读取一条数据,当事务A修改这条数据并提交后,事务B再读取这条数据时,数据发生了变化,即事务B每次读取的数据有可能不一致,这种情况叫做“不可重复读”。
        • repeatable read 重复读
          MySQL默认的隔离级别是重复读,该级别可以达到“重复读”的效果,但是会有“幻读”的问题,即事务A读取数据,此时事务B修改了这条数据,但是事务A读取的还是之前的旧数据的内容,这样就出现了幻读。
        • serializable 串行化
          事务A和事务B,事务A在操作数据库表中数据的时候,事务B只能排队等待,这样保证了同一个时间点上只有一个事务操作数据库,该级别可以解决“幻读”的问题。但是这种级别一般很少使用,因为吞吐量太低,用户体验不好。

    2.数据库的事务操作

    事务具有四个特征ACID

    • 原子性(Atomicity),事务是最小单元,不可再分;
    • 一致性(Consistency),事务要求所有的DML语句操作的时候,必须保证同时成功或同时失败;
    • 隔离性(Isolation),一个事务不会影响其他事务的执行;
    • 持久性(Durability),在事务完成之后,该事务对数据库所作的更改将持久地保存在数据库中,并不会被回滚;

    MySQL事务的提交和回滚

    MySQL中默认情况下,事务是自动提交的,当执行一条DML(增删改)语句时,就开启并且自动提交了事务。可以通过下面的语句查看事务是否是自动提交的:

    show variables like '%commit%';
    

    如果想要关闭MySQL事务的自动提交,可以使用下面语句手动开启事务:

    start transaction;
    

    为了方便演示提交和回滚,先初始化一些数据:

    create table t_bank(
        account int(10) primary key,
        money int(15)
    );
    
    insert into t_bank values 
    (1001,1000),
    (1002,2000);
    

    手动开启事务:

    start transaction;
    

    执行下面语句:

    update t_bank set money=500 where account=1001;
    update t_bank set money=2500 where account=1002;
    

    执行查询操作:

    select * from t_bank;
    

    数据已改变。

    表2

    重新开启一个MySQL连接,执行查询操作:

    select * from t_bank;
    

    因为是新开启的MySQL连接,所以查询结果中money字段的数据并未改变,说明上面的操作还没有修改数据库中的字段值。

    表1

    回到之前的连接中,输入:

    rollback;
    

    此时事务将会回滚,清空内存中的记录,不会修改数据库中的字段值。

    再次执行查询操作:

    select * from t_bank;
    

    数据并未改变。

    上面输入

    rollback;
    

    命令,数据库会执行回滚操作,如果想要提交事务,则输入命令:

    commit;
    
    遇事犹豫不决时,须持虎狼之心,行仁义之事
  • 相关阅读:
    dubbo快速入门
    UmiJS快速入门
    springboot整合springsecurity
    springmvc快速入门
    spring快速入门
    RabbitMQ快速入门
    解决openFeign远程调用超时的异常
    vue实现全局登录
    XMLHttpRequest简介
    IE8兼容性经验小结
  • 原文地址:https://www.cnblogs.com/fmlyzp/p/10388060.html
Copyright © 2011-2022 走看看