資料庫事務
原子性:組成乙個事務的多個資料庫操作為乙個整體,只有全部成功才能提交,只要乙個失敗就需要全部回滾撤銷。
一致性:事務成功後,資料庫狀態和他的業務規則要一致。
隔離性:不同事物之間不會互相干擾。但實際中並不會要求完全不會干擾,不同的事務隔離級別對於不同的干擾程度。
永續性:一旦事務成功,所有資料都需要被持久化到資料庫中。
資料併發的問題
髒讀:a事務讀到了b事務未提交更改的資料,並在這個資料的基礎上進行操作。如果b事務回滾,a事務的操作就是有問題的。
不可重複讀:a讀取了b事務已提交的資料修改。也就是在同一事物中,多次讀取同一資料發生了不一致。
幻讀:a事務讀取了b事務提交的新增資料,這是會出現幻讀。幻讀和不可重複讀比較類似,區別在於新增和更新。幻讀需要新增表級鎖才能解決,而不可重複讀新增行鎖即可。
第一類資料更新丟失:a事務撤銷時,把b事務提交更新的資料覆蓋了。
第二類資料更新丟失:a事務提交後,把b事務提交更新的資料覆蓋了。
資料庫的鎖機制(mysql)
共享/排他鎖:
共享鎖 s:讀取資料使用,讀讀可並行
排它鎖 x:修改資料使用:寫讀,寫寫不可並行
意向鎖:
表級鎖:innodb為支援多粒度鎖機制,允許表級鎖和行級鎖共存。意向鎖代表,未來的某個時刻,事務可能要加共享或排它鎖,先提前宣告乙個意向。意向鎖只代表意向,所以意向鎖之間可以相容。也就是不同事物可以同時給同一張表新增意向鎖。
意向共享鎖 is:事務可能要新增共享鎖,只有先獲得表的is鎖,才能獲得對應的s鎖
意向排它鎖 ix:事務可能要新增排它鎖,只有先獲得表的ix鎖,才能獲得對應的x鎖。一旦某個事務新增了意向排它鎖或排它鎖,那麼其他事務不能新增普通的排它鎖和共享鎖了。
記錄鎖:封鎖鎖索引記錄,這裡鎖的是索引
鎖的是非主鍵索引,會在索引記錄加鎖然後再去主鍵索引加鎖
表上如果沒有索引,會隱式的在主鍵索引加鎖
如果要鎖的列沒有索引,會在全表記錄加鎖
間隙鎖,封鎖索引記錄中的間隔,防止其他事物插入某個索引記錄區間,並且防止更新資料到區間內。主要用於防止不可重複讀,事務隔離級別降為為rc後,間隙鎖自動失效。
臨鍵鎖:是記錄鎖和間隙鎖的組合,既鎖索引也鎖索引記錄。當索引含有唯一屬性,自動降級為記錄鎖,只鎖本身不鎖範圍。
插入意向鎖:間隙鎖的一種,專門針對insert操作。同索引,同範圍,不同事務插入的位置不衝突,不會阻塞。
自增鎖:專門針對自增字段,保證插入欄位都是連續自增的。表級鎖。
事務隔離級別
讀未提交:最低級別,會造成髒讀,不可重複讀,幻讀
讀已提交:rc級別會對讀取到的記錄加記錄鎖,保證只能讀取到已提交事務的資料,不會出現髒讀,會出現不可重複讀,幻讀。
重複讀:可以解決不可重複讀,但仍存在幻讀問題。mysql用mvcc解決讀寫併發問題,間隙鎖解決寫寫併發問題,從而處理幻讀問題。
序列化:效率低下,但解決了所有問題。
七種事務傳播行為
required:沒有則建立,有則加入
supports:沒有就沒有,有則加入
mandatory:沒有則拋異常,有則加入
required_new:必須用新的,舊事務掛起
not_supported:不使用事務,有則掛起
never:有則拋異常,沒有就以非事務執行
nested:有則巢狀事務內執行,沒有則新建乙個事務
一些小知識
1.答 int elev 10 0.5 10 3答 arctoolbox中有直接的工具!data management tools features feature to polygon 4如何用arcgis實現指定範圍的dem水平切面 主要是想實現dem和水面結合的三維效果 但如何計算水面範圍 答...
QProcess一些小知識
1.啟動外部程式的兩種方式 1 一體式 void start 外部程式啟動後,將隨主程式的退出而退出 2 分離式 void startdetached 外部程式啟動後,當主程式退出時並不退出。而是繼續執行。2.當程式路徑中含有空格的時候,特別是windows系統該程式路徑會無法被識別。解決方法是將程...
Oracle一些小知識
1 select from table name for update 和 select t.t.rowid from table name t的區別 二者都可以編輯表資料,但是前者會鎖表,後者則不會。原理且不深究,當我們修改某一行資料時,如果不想鎖表就是用後者。2 邏輯判斷 select 1 fr...