事務隔離級別

2021-09-06 01:20:45 字數 2109 閱讀 9624

系統事務隔離:

事務隔離的原因:髒讀:一事務回滾,一事務執行。 不可重複讀與幻想讀:二個事務交叉,不涉及回滾。 要改變在乙個事務執行的過程中,不受其它事務影響的思路,要認為影響程度是由事務隔離的級別來決定。

事務的隔離級別產生的原因就是為了避免當前事務的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)隔離級別越高,效能損失越大。

事務隔離級別

1 serializable 最嚴格的spring事務隔離級別,事務序列執行,資源消耗最大 3 read committed 大多數主流資料庫的預設spring事務隔離等級,保證了乙個事務不會讀到另乙個並行事務已修改但未提交的資料,避免了 髒讀取 該級別適用於大多數系統。4 read uncommi...

事務隔離級別

四種隔離級別 隔離級別 髒 讀不可重複讀取 幻 像讀操作未提交 read uncommitted 是是 是讀操作已提交 read committed 否是 是可重複讀 repeatable read 否否 是快照否否 否可序列讀 serializable 否否 否 sql server 還支援使用行...

事務隔離級別

需要防止的現象和事務隔離級別 ansi iso sql 標準 sql92 定義了四種事務隔離級別 transaction isolation level 這四種隔離級別所能提供的事務處理能力各不相同。這些事務隔離級別是針對三種現象定義的,在併發事務執行時,需要阻止這三種現象 中的一種或多種發生。三種...