1. 程式人生 > 實用技巧 >asp.net core api使用Swagger

asp.net core api使用Swagger

隔離級別:

分為:

1.讀未提交;2.讀已提交;3.可重複讀;4.序列劃

資料庫會出現的問題:1.髒讀;2.不可重複讀;3.幻讀

不同隔離級別,能處理的問題不同:

那來看看下面一些概念:

髒讀:指的是一個事務讀取到了另一個事務未提交的更新資料:

===session1===
SELECT @@tx_isolation;
SET tx_isolation='READ-UNCOMMITTED';
BEGIN;
insert into students(`name`,age,teacherId) VALUES ('takey123',25,1)
ROLLBACK;
COMMIT;


===session2===
SET tx_isolation='READ-UNCOMMITTED';
SELECT * FROM students

 說明:事務1,設定隔離級別為讀未提交。然後開啟事務,insert一條記錄,但是不提交。

    此時事務2,查詢到了所有資料,包扣事務1插入但是還沒提交的資料,假如做了sum()運算。這是事務1回滾事務。這樣就出問題了。事務2的資料並不是準確的。

    為了避免這種情況,只能設定更高的隔離級別

不可重複讀:一個事務多次讀取同一資料返回的結果不同,換句話說,後續讀取可以讀到另一個事務已提交的更新資料。

      相反, “可重複讀”在同一事務中多次讀取資料時, 能夠保證所讀資料一樣, 也就是後續讀取不能讀到另一事務已提交的更新資料。

      事務B修改資料導致當前事務A前後讀取資料不一致 ,側重點在於事務B的修改

===session1===
SELECT @@tx_isolation;
SET tx_isolation='READ-COMMITTED';
BEGIN;
SELECT * FROM students

SELECT * FROM students

COMMIT;


===session2===
SET tx_isolation='READ-COMMITTED';
UPDATE students SET age=25 WHERE `name`='min';

  說明:事務1第一次讀取資料表,獲取學生的年齡是25歲。此時事務2對該學生的年齡修改為40並提交。

     事務1第二次讀取資料表,獲取學生的年齡是40歲。這就出現了同一事務多次讀取到的資料不一致,導致不可重複讀。

幻讀:查詢表中資料如果沒有存在就插入一條資料。在併發的時候,裡面會出現2條一樣的資料。

   事務A在查詢資料庫是,發現沒有此資料,就去插入一條資料,但是此時事務B也是查詢不到資料去插入一條資料並插入成功了。

   如果事務A此時再去查的時候,發現了有這條資料,就感覺出現了幻覺,明明自己還沒插入,但是又出現了這條資料。

===session1===
SELECT @@tx_isolation;
SET tx_isolation='REPEATABLE-READ';
BEGIN;
SELECT * from students WHERE `name`='takey123';
#此時,另一個事務插入了資料
SELECT * from students WHERE `name`='takey123';
insert into students(`name`,age,teacherId) VALUES ('takey123',25,1)
SELECT * from students WHERE `name`='takey123';
UPDATE students SET age=40 WHERE `name`='takey123';
SELECT * from students WHERE `name`='takey123';
COMMIT;


===session2===
SET tx_isolation='REPEATABLE-READ';
insert into students(`name`,age,teacherId) VALUES ('takey123',25,1)

  說明:事務1,插入資料庫中是否存在資料,如果不存在的時候去插入這條資料,但是在查詢不存在的時候,事務2,插入了該條資料,

     事務1也插入該條資料,導致資料庫中有2條一模一樣的資料。這就產生了幻讀。