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