oracle提供了三個隔離級別: 1.讀提交 ,簡而言之只能讀取語句開始執行前提交的數據 2.串列,這個好理解,就是事務串列運行,避免經典的三個場景-臟讀、不可重覆讀、幻讀。 3.只讀,oracle已經實現的只讀模式。 -- 這些都很容易理解,問題的關鍵是解決一些實際的問題,例如典型的汽車票銷售。 ...
oracle提供了三個隔離級別:
1.讀提交 ,簡而言之只能讀取語句開始執行前提交的數據
2.串列,這個好理解,就是事務串列運行,避免經典的三個場景-臟讀、不可重覆讀、幻讀。
3.只讀,oracle已經實現的只讀模式。
--
這些都很容易理解,問題的關鍵是解決一些實際的問題,例如典型的汽車票銷售。
1.對於查票事務而言,使用簡單的讀提交隔離級別即可,讀取那些可售票(狀態不是已經售出或者正在銷售的)
2.對於售票事務而言,只需要簡單使用竄行隔離級別即可,在開始購買時候,先設置標記為正在銷售,完成之後設置銷售完畢,並提交事務。
具體簡單的做法就是
set transaction isolation level serializable;
update tickets a set a.status='sailing' where a.seat_no=?;
如果其它事務也企圖這麼做,但當前事務還沒有提交,那麼就會引發ORA-08177: Cannot serialize access for this transaction
應用遇到這條信息的時候,就知道這個座位已經被臨時占用了,可以換一個座位。
如果為了避免可能的高概率異常,選票可以放在一個過程中處理,避免比必要的網路傳輸。
--
如果在一個高併發的應用中,例如像12306那樣的應用,如何避免負載過大? 理論上使用oracle的exdata即可解決這種,當然在應用設計上也需要有一些好的想法