數據庫:oraclehtml
狀況描述:user1和user2同時執行相同的查找條件,user1將張三的Address字段修改了,以後user2更新張三的phone字段(和user1的操做時間無需同時,僅僅是接近也會出現這個問題),user1再次查找張三的信息時,發現Address仍是原來的數據。
接到客戶「投訴」時,有不少開發者會將這種錯誤歸咎於客戶操做錯誤,由於這種狀況機率極小,很是難以重現。但其實是因爲user2查詢的仍是user1更新以前的數據,那麼對於張三這條數據來講,user1的更新操做就至關於丟失了,張三的地址並無被修改。web
解決方案:
a.悲觀鎖定:在執行關鍵的信息查詢時使用 sql
select * from t where name=「張三」for update nowait
優缺點:
使用悲觀鎖定時,在user1查詢的期間都將鎖定數據,當user2執行更新時,sql將等待或者提示「resource busy」。這會形成性能方面缺失,可是不會覆蓋更新且user2無需從新提交修改。數據庫
b.樂觀鎖定
使用oracle
update t set phone = 「XXX」 where id = 「xxx」svg
擴展:for update 和 for update nowait 的區別
for update 和for update nowait主要區別在因而否等待,若是不加nowait,在執行select時就會報錯,若是加了nowait,在執行select時就會等待,直至鎖被釋放。
https://www.cnblogs.com/mouseIT/p/4174157.html性能
使用spa
Alter table t Modiify(cloumn number)code
修改列值時,數據庫其實先執行刪除後執行插入已達到更新的效果。若是插入的時候由於某種緣由失敗了,會致使數據庫丟失此列的信息。xml