不可重複讀:同樣的條件,你讀取過的數據,再次讀取出來發現值不一樣了。
幻讀:同樣的條件,第1次和第2次讀出來的記錄數不一樣
1.不可重複讀
同樣的條件,你讀取過的數據,再次讀取出來發現值不一樣了。
例子:
在事務1中,A讀取了自己的工資爲1000,但是此時事務1的操作還並沒有完成 ,後面還有1次相同的讀取操作。
- con1 = getConnection();
- select salary from employee where employeeName ="A";
在事務2中,這時財務人員修改了A的工資爲2000,並提交了事務。
- con2 = getConnection();
- update employee set salary = 2000 where employeeName = "A";
- con2.commit();
在事務1中,A再次讀取自己的工資時,工資變爲了2000 。
- select salary from employee where employeeName ="A";
在一個事務中前後兩次讀取的結果並不致,導致了不可重複讀。
2.幻讀
同樣的條件,第1次和第2次讀出來的記錄數不一樣。
例子:
目前工資爲1000的員工有5人。
事務1,讀取所有工資爲1000的員工,共讀取10條記錄 。
- con1 = getConnection();
- Select * from employee where salary =1000;
這時另一個事務向employee表插入了一條員工記錄,工資也爲1000
- con2 = getConnection();
- Insert into employee(employeeName,salary) values("B",1000);
- con2.commit();
事務1再次讀取所有工資爲1000的員工,共讀取到了6條記錄,這就產生了幻讀。
- //con1
- select * from employee where salary =1000;