臟讀
臟讀是指一個事務讀取到另一個事務沒有提交到數據庫中的數據(該數據也有可能進行了回滾)
例子:
買家李某向賣家張某的購買一雙鞋子,買家李某向銀行柜員機對賣家張某進行匯款100元(其他事務),賣家張某賬戶上原有5000元,張某向柜員機查看信息(事務1)發現果真到賬,于是發貨,但是事務1的提交時間過長,系統進行回滾,于是又把100元返回買家李某,賣家張某后來再去查銀行上的money發現還是tm的5000元.這就是在數據庫中發生了臟讀.(真的好tm臟,原本到手的錢又飛了)
不可重復讀
不可重復讀的重點是修改:
同樣的條件, 你讀取過的數據, 再次讀取出來發現值不一樣了
例子:
在事務1中,Mary 讀取了自己的工資為1000,操作并沒有完成
java代碼
con1 = getConnection(); select salary from employee empId ="Mary"; 在事務2中,這時財務人員修改了Mary的工資為2000,并提交了事務. Java代碼
con2 = getConnection(); update employee set salary = 2000; con2.commit(); 在事務1中,Mary 再次讀取自己的工資時,工資變為了2000 Java代碼
//con1 select salary from employee empId ="Mary"; 在一個事務中前后兩次讀取的結果并不致,導致了不可重復讀。幻讀
幻讀的重點在于新增或者刪除同樣的條件, 第1次和第2次讀出來的記錄數不一樣
例子:
目前工資為1000的員工有10人。 事務1,讀取所有工資為1000的員工。
Java代碼
con1 = getConnection(); Select * from employee where salary =1000; 共讀取10條記錄 這時另一個事務向employee表插入了一條員工記錄,工資也為1000 Java代碼
con2 = getConnection(); Insert into employee(empId,salary) values("Lili",1000); con2.commit(); 事務1再次讀取所有工資為1000的員工 Java代碼
//con1 select * from employee where salary =1000; 共讀取到了11條記錄,這就產生了幻像讀。新聞熱點
疑難解答