幻讀和不可重複讀的區別

不可重複讀:同樣的條件,你讀取過的數據,再次讀取出來發現不一樣了。

幻讀:同樣的條件,第1次和第2次讀出來的記錄數不一樣

 

1.不可重複讀

同樣的條件,你讀取過的數據,再次讀取出來發現不一樣了。

例子:

在事務1中,A讀取了自己的工資爲1000,但是此時事務1的操作還並沒有完成 ,後面還有1次相同的讀取操作。

  1. con1 = getConnection();
  2. select salary from employee where employeeName ="A";

在事務2中,這時財務人員修改了A的工資爲2000,並提交了事務。

  1. con2 = getConnection();    
  2. update employee set salary = 2000 where employeeName = "A";    
  3. con2.commit();  

在事務1中,A再次讀取自己的工資時,工資變爲了2000 。

  1. select salary from employee where employeeName ="A";   

在一個事務中前後兩次讀取的結果並不致,導致了不可重複讀。

2.幻讀

同樣的條件,第1次和第2次讀出來的記錄數不一樣。

例子:

目前工資爲1000的員工有5人。 

事務1,讀取所有工資爲1000的員工,共讀取10條記錄 。

  1. con1 = getConnection();    
  2. Select * from employee where salary =1000;  

這時另一個事務向employee表插入了一條員工記錄,工資也爲1000 

  1. con2 = getConnection();    
  2. Insert into employee(employeeName,salary) values("B",1000);    
  3. con2.commit();   

事務1再次讀取所有工資爲1000的員工,共讀取到了6條記錄,這就產生了幻讀。 

  1. //con1    
  2. select * from employee where salary =1000;  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章