1. 程式人生 > 程式設計 >Springmvc ViewResolver設計實現過程解析

Springmvc ViewResolver設計實現過程解析

一、事務

  1、定義:Transaction Control Language 事務控制語言

    一個或一組sql語句組成一個執行單元,這個執行單元要麼全部執行,要麼全部不執行。

    在mysql中用的最多的儲存引擎有:innodb,myisam,memory等,但只有使用了Innodb資料庫引擎的資料庫或表才支援事務

  2、事務的特性:ACID

    原子性:事務是最小單位,一個事務不可再分割

    一致性:一個事務執行會使資料從一個一致狀態切換到另外一個一致狀態

    隔離性:一個事務的執行不受其他事務的干擾

    永續性:一個事務一旦提交,則會永久的改變資料庫的資料.

  3、事務的建立

    1)隱式事務:事務沒有明顯的開啟和結束的標記;比如insert、update、delete語句

    2)顯式事務:事務具有明顯的開啟和結束的標記;

      前提:必須先設定自動提交功能為禁用,set autocommit=0;

    3)操作步驟

    步驟1:開啟事務

         set autocommit=0;(只針對當前會話有效)

         start transaction;可選的

      步驟2:編寫事務中的sql語句(select insert update delete)

         語句1;

         語句2;

         ...
     步驟3:結束事務

         commit;提交事務

         rollback;回滾事務

         savepoint 節點名;設定儲存點(類似設定斷點)

  4、演示事務的使用步驟

#開啟事務
SET autocommit=0;
START TRANSACTION;
#編寫一組事務的語句
UPDATE account SET balance = 1000 WHERE username='張無忌'; UPDATE account SET balance = 1000 WHERE username='趙敏'; #結束事務 ROLLBACK; #
commit;
#演示savepoint的使用
SET autocommit=0;
START TRANSACTION;
DELETE FROM account WHERE id=25;

SAVEPOINT a;#設定儲存點

DELETE FROM account WHERE id=28;
ROLLBACK TO a;#回滾到儲存點(第二條未被刪除)

  5、事務併發問題

    對於同時執行的多個事務, 當這些事務訪問資料庫中相同的資料時, 如果沒有采取必要的隔離機制, 就會導致各種併發問題:

    1)髒讀: 對於兩個事務T1, T2, T1 讀取了已經被T2 更新但還沒有被提交的欄位. 之後, 若T2 回滾, T1讀取的內容就是臨時且無效的.

    2)不可重複讀: 對於兩個事務T1, T2, T1 讀取了一個欄位, 然後T2 更新了該欄位. 之後, T1再次讀取同一個欄位, 值就不同了.

    3)幻讀: 對於兩個事務T1, T2, T1 從一個表中讀取了一個欄位, 然後T2 在該表中插入了一些新的行. 之後, 如果T1 再次讀取同一個表, 就會多出幾行.

  6、事務的隔離級別

    資料庫系統必須具有隔離併發執行各個事務的能力, 使它們不會相互影響, 避免各種併發問題;

    一個事務與其他事務隔離的程度稱為隔離級別. 資料庫規定了多種事務隔離級別, 不同隔離級別對應不同的干擾程度, 隔離級別越高, 資料一致性就越好, 但併發性越弱.

    1)每啟動一個mysql 程式, 就會獲得一個單獨的資料庫連線. 每個資料庫連線都有一個全域性變數@@tx_isolation, 表示當前的事務隔離級別.

     檢視當前的隔離級別: SELECT @@tx_isolation;

    2)設定當前mySQL 連線的隔離級別:

      set transaction isolation level read committed;

    3)設定資料庫系統的全域性的隔離級別:

      set globaltransaction isolation level read committed;

    4)mysql中預設第三個隔離級別 repeatable read

      oracle中預設第二個隔離級別 read committed

隔離級別 髒讀 不可重複讀 幻讀
read uncommitted(讀未提交資料) 允許事務讀取未被其他事物提交的變更,髒讀、不可重複讀和幻讀的問題都會出現
read committed(讀已提交資料) × 只允許事務讀取已經被其他事務提交的變更,可以避免髒讀,但不可重複讀和幻讀問題仍可能出現
repeatable read(可重複讀) × × 確保事務可以多次從一個欄位中讀取相同的值,在這個事務持續期間,禁止其他事務對這個欄位進行更新,可以避免髒讀和不可重複讀,但幻讀的問題仍存在
serializable(序列化) × × × 確保事務可以從一個表中讀取相同的行,在這個事務持續期間,禁止其他事務對該表執行插入、更新和刪除操作,所有併發問題都可以避免,但效能是否低下