面試外排中國移動的數據庫問題整理

        昨天上午去中國移動面試,首先讓作了一份智力題。。。。。,真是無力吐槽了,真正面試是是三個面試官,一個是項目負責人,另外兩個是技術組長,他們主要針對你的項目問問題,問的很蛋疼,問題就是針對,要是若是登陸成功之後使用某種會員功能,如何校驗,說的很明白會根據登陸成功後的數據庫用戶信息去判斷。就盯着你的項目問,還問你數據庫幾個什麼表,怎麼作表的。mysql

      具體有點意義的問題就是面試

       1.數據庫事務sql

       事務的隔離級別(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(增刪改)語句時,就開啓而且自動提交了事務。能夠經過下面的語句查看事務是不是自動提交的:ui

show variables like '%commit%'; 

若是想要關閉MySQL事務的自動提交,可使用下面語句手動開啓事務:spa

start transaction; 

爲了方便演示提交和回滾,先初始化一些數據:3d

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

手動開啓事務:code

start transaction; 

執行下面語句:blog

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; 
相關文章
相關標籤/搜索