?事務與同步之間的一些疑惑

用@Transaction來定義方法,方法裏有讀庫,也有寫庫。事務和同步之間會不會有什麼關聯呢?若是事務太長會不會影響到訪問呢?會不會形成死鎖呢? mysql

如何才能高效使用事務機制呢?如今對事務有點不太瞭解。 spring

但我也有了一些本身的理解,但不知道對不對: sql

事務和同步在mysql裏是兩個層級的概念。事務架於同步層之上。事務是一個業務層的概念,而同步時資源層的概念。當事務裏對同一條記錄進行Update的操做的時候,可定會出現同步問題,但這是沒法避免的。根據層次思想,第n層調用第n-1層。咱們所能作的就是設計好業務層,定義好表,別出現不一樣用戶update同一條記錄的狀況(這種狀況幾乎很難遇到)。 數據庫

事務的ACID原則在某種程度上也使得第n層的事務和第n-1層的資源層之間的「理還亂」的關係清晰了些。 併發

但,oracle中的多個隔離級別又是怎麼一回事? oracle

 

再大膽來個猜測:數據庫ACID的實現 .net

基本思想: 線程

1 COW(copy on write) 設計

2 每個表都有一個static的位置指針,供多個線程同時insert時使用 指針

3 insert,update這些操做在insert,update到copy區域時會進行類型,長度,惟一性等檢查。若是能執行,在commit後,直接把該區域複製到真正的表空間中,由static pos指示。pos須要同步。


oschina.net彈出來的文章對我有幫助:http://my.oschina.net/shangjx13/blog/78882

其中說到了FOR UPDATE

BEGIN;

SELECT book_number FROM book WHERE  book_id = 123 FOR UPDATE;

// ...

UPDATE book SET book_number = book_number - 1 WHERE  book_id = 123;

COMMIT;

由 於加入了FOR UPDATE,因此會在此條記錄上加上一個行鎖,若是此事務沒有徹底結束,那麼其餘的事務在使用SELECT ... FOR UPDATE請求的時候就會處於等待狀態,直到上一個事務結束,它才能繼續,從而避免了問題的發生,須要注意的是,若是你其餘的事務使用的是不帶FOR UPDATE的SELECT語句,將得不到這種保護。


今天讀spring in action一書,對上述疑問有了一些理解:

I :isolation

事務應該容許多個用戶操做同一個數據,一個用戶的操做不會和其餘用戶的操做相混淆。所以,事務必須是互相隔離的,防止併發讀寫同一個數據的狀況發生。(注意,隔離一般意味着要鎖定數據庫裏的記錄和(或)整張表)

相關文章
相關標籤/搜索