JavaEE容易忽略的問題

1.丟失更新。

數據庫: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性能

2.數據庫更新列致使列被刪除

使用spa

Alter table t Modiify(cloumn number)code

修改列值時,數據庫其實先執行刪除後執行插入已達到更新的效果。若是插入的時候由於某種緣由失敗了,會致使數據庫丟失此列的信息。xml