• <nav id="wkkge"><strong id="wkkge"></strong></nav>
  • <menu id="wkkge"></menu>
  • MySQL數據庫概述及數據準備
    MySQL數據庫常用命令
    MySQL數據庫查看表結構
    MySQL查詢字段
    MySQL條件查詢
    MySQL排序
    MySQL函數
    MySQL分組函數/聚合函數/多行處理函數
    MySQL分組查詢
    MySQL連接查詢
    MySQL子查詢
    MySQL UNION
    MySQL中limit的用法
    MySQL表
    MySQL存儲引擎
    MySQL事務
    MySQL索引
    MySQL視圖
    MySQL DBA命令
    MySQL數據庫設計的三大范式
    MySQL數據庫練習題

    MySQL的事務隔離級別

     

     

    隔離級別

     

    1、事務的隔離級別決定了事務之間可見的級別。

     

    2、當多個客戶端并發地訪問同一個表時,可能出現下面的一致性問題:

     

    ● 臟讀取(Dirty Read) 

     

    一個事務開始讀取了某行數據,但是另外一個事務已經更新了此數據但沒有能夠及時提交,這就出現了臟讀取。

     

    ● 不可重復讀(Non-repeatable Read) 

     

    在同一個事務中,同一個讀操作對同一個數據的前后兩次讀取產生了不同的結果,這就是不可重復讀。

     

    ● 幻像讀(Phantom Read) 

     

    幻像讀是指在同一個事務中以前沒有的行,由于其他事務的提交而出現的新行。

     

     

    四個隔離級別

     

    InnoDB 實現了四個隔離級別,用以控制事務所做的修改,并將修改通告至其它并發的事務:

     

    ● 讀未提交(READ UMCOMMITTED) 

     

    允許一個事務可以看到其他事務未提交的修改

     

    ● 讀已提交(READ COMMITTED) 

     

    允許一個事務只能看到其他事務已經提交的修改,未提交的修改是不可見的

     

    ● 可重復讀(REPEATABLE READ) 

     

    確保如果在一個事務中執行兩次相同的SELECT語句,都能得到相同的結果,不管其他事務是否提交這些修改。 (銀行總賬)

     

    該隔離級別為InnoDB的缺省設置

     

    ● 串行化(SERIALIZABLE) 【序列化】

     

    將一個事務與其他事務完全地隔離。 

     

    例如:

     

    A可以開啟事物,B也可以開啟事物

     

    A在事物中執行DML語句時,未提交

     

    B不以執行DML,DQL語句

     

     

    隔離級別與一致性問題的關系

     

     

     

    設置服務器缺省隔離級別

     

    1、通過修改配置文件設置

     

    ● 可以在my.ini文件中使用transaction-isolation選項來設置服務器的缺省事務隔離級別

     

    ● 該選項值可以是: 

     

    READ-UNCOMMITTED

     

    READ-COMMITTED

     

    REPEATABLE-READ

     

    SERIALIZABLE

     

    ● 例如:

     

    [mysqld]

     

    transaction-isolation = READ-COMMITTED

     

    2、通過命令動態設置隔離級別

     

    ● 隔離級別也可以在運行的服務器中動態設置,應使用SET TRANSACTION ISOLATION LEVEL語句

     

    ● 其語法模式為:

     

    SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL <isolation-level>

     

    其中的<isolation-level>可以是:

     

    READ UNCOMMITTED

     

    READ COMMITTED

     

    REPEATABLE READ

     

    SERIALIZABLE

     

    ● 例如: SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

     

     

    隔離級別的作用范圍

     

    1、事務隔離級別的作用范圍分為兩種: 

     

    ● 全局級:對所有的會話有效 

     

    ● 會話級:只對當前的會話有效 

     

    2、例如:設置會話級隔離級別為READ COMMITTED :

     

    mysql> SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

     

    或:

     

    mysql> SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

     

    3、設置全局級隔離級別為READ COMMITTED :

     

    mysql> SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;

     

     

    查看隔離級別

     

    1、服務器變量tx_isolation(包括會話級和全局級兩個變量)中保存著當前的會話隔離級別。 

     

    2、為了查看當前隔離級別,可訪問tx_isolation變量:

     

    ● 查看會話級的當前隔離級別:

     

    mysql> SELECT @@tx_isolation;

     

    或: 

     

    mysql> SELECT @@session.tx_isolation;

     

    ● 查看全局級的當前隔離級別: 

     

    mysql> SELECT @@global.tx_isolation;

     

     

    并發事務與隔離級別示例


    read uncommitted(未提交讀) --臟讀(Drity Read):
     

    會話一

    會話二

    mysql> prompt s1>

    mysql> use bjpowernode

    s1>use bjpowernode

    mysql> prompt s2>

    s1>create table tx (

    id int(11),

    num int (10)

    );

     

    s1>set global transaction isolation level read uncommitted;

     

    s1>start transaction;

     

     

    s2>start transaction;

    s1>insert into tx values (1,10);

     

     

    s2>select * from tx;

    s1>rollback;

     

     

    s2>select * from tx;

     

    read committed(已提交讀)

     

    會話一

    會話二

    s1> set global transaction isolation level read committed;

     

    s1>start transaction;

     

     

    s2>start transaction;

    s1>insert into tx values (1,10);

     

    s1>select * from tx;

     

     

    s2>select * from tx;

    s1>commit;

     

     

    s2>select * from tx;

     

    repeatable read(可重復讀)

     

    會話一

    會話二

    s1> set global transaction isolation level repeatable read;

     

    s1>start transaction;

    s2>start transaction;

    s1>select * from tx;

     

    s1>insert into tx values (1,10);

     

     

    s2>select * from tx;

    s1>commit;

     

     

    s2>select * from tx;

     

    全部教程
  • <nav id="wkkge"><strong id="wkkge"></strong></nav>
  • <menu id="wkkge"></menu>
  • 面对面棋牌游戏