交易隔離等級

來源:互聯網
上載者:User

系統事務隔離:

 

事務隔離的原因:髒讀:一交易回復,一事務執行。 不可重複讀取與幻想讀:二個事務交叉,不涉及復原。 要改變在一個事務執行的過程中,不受其它事務影響的思路,要認為影響程度是由事務隔離的層級來決定。
事務的隔離等級產生的原因就是為了避免當前事務的sql立刻執行影響到其它事務.隔離很好理解,就是事務對保護地區的控制。為了延展性,一般盡量限制事務的保護地區。最嚴格的也是最好理解的例子就是可序列化層級,將並發的事務強製為線性順序執行的事務,當然會解決對應用影響不大的幻讀,注意,由於是順序執行事務,就不能再理解為“阻止其它事務”。因為當前訪問資料的就只有一個事務。我以前一直認為序列化會將整個表鎖定來“阻止其它事務寫入或刪除”而導致的幻讀。看來完全錯誤,沒有好好理解序列化的意思。序列化付出的效能損失是巨大的。

通常的思考方式是先假定沒有交易隔離等級存在的情況下,hibernate中的session.flush()或jdbc中的executeQuery(sql)/executeUpdate(sql)會修改共用記錄集而影響到其它事務。然後,我們可以針對這些影響採取適當的隔離等級。注意沒有commit之前,並沒有持久化到庫裡。隨時可以復原,髒讀就是由於一個系統事務讀到另一個系統交易回復之前的資料導致的。一定要注意到雖然事務沒有提交,但事務裡的sql集已經修改了共用記錄集。

注意
1.髒讀由於涉及到事務的復原,所以,需要con.setAutoCommit(false);而重複讀,幻讀不涉及交易回復,所以不用調用該語句。
2.JDBC的事務執行sql除非使用batch,一般會立即更新到資料庫裡:
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:demo" , "scott" , "tiger");
PreparedStatement ps = conn.prepareStatement("insert into dept2 values(? , ? , ?)");
ps.setInt(1, 21);
ps.setString(2, "s1");
ps.setString(3, "s2");
ps.addBatch();
ps.setInt(1, 21);
ps.setString(2, "s3");
ps.setString(3, "s4");
ps.addBatch();
ps.setInt(1, 21);
ps.setString(2, "s5");
ps.setString(3, "s6");
ps.addBatch();
ps.executeBatch();
ps.close();
conn.close();

3.hibernate執行sql有點複雜。
首先如果session的FLUSHMODE=auto.那麼會在其它query執行之前,手動調用flush之前,事務commit之前,調用flush,進而執行sql.
總之,通過session.flush()最終會執行sql(sql哪裡構造的,具體看hibernate的代碼吧,舉個例子應該在session.update(object)與session.flush()之間。flush報sql語句錯誤,那可能的原因是update的object有問題。另一個是在flush之前,清空了object,這樣也會導致sql有問題)。
hibernate執行flush後只是將Hibernate緩衝中的資料提交到資料庫,如果這時資料庫處在一個事物當中,[則資料庫將這些SQL語句緩衝起來],當Hibernate進行commit時,會告訴資料庫,你可以真正提交了,這時資料才會永久儲存下來,也就是被持久化了.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

二個事務在操作同一個共用記錄集時,可能會出現的問題:(A)髒讀 (B)不可重複讀取 (C)幻讀
JDBC的隔離等級(1)read-uncommit, (2)read-commit, (3)read-repeatable, (4)read-serializable都是用來阻止上面的問題的。
(1)什麼都阻止不了。
(2)阻止(A)
(3)阻止(A)(B)
(4)阻止(A)(B)(C)

(1)->(4)隔離等級越高,效能損失越大。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.