(1)原子性:事務開始後全部的操做要麼一塊兒成功,要麼一塊兒失敗,整個事務是一個不可分割的總體。java
(2)一致性:是物開始前到結束後,數據庫的完整性約束沒有被破壞。mysql
(3)隔離性:同一時間只容許一個事務請求同一事務,不一樣事務互不干擾。sql
(4)持久性:事務完成,事務對數據庫的全部更新將被保存到數據庫,不能回滾。數據庫
tps:數據庫的完整性約束-->數據完整性:存儲在數據庫中的全部數據值均正確的狀態。它是應防止數據庫中存在不符合語義規定的數據和防止因錯誤信息的輸入輸出形成無效操做或錯誤信息而提出的。數據完整性分爲四類: 1. 實體完整性(實體完整性是對關係中的記錄惟一性,也就是主鍵的約束。準確地說,實體完整性是指關係中的主屬性值不能爲Null且不能有相同值。定義表中的全部行能惟一的標識,通常用主鍵,惟一索引 unique關鍵字,及identity屬性好比說咱們的身份證號碼,能夠惟一標識一我的.。) 2. 域完整性(域完整性是對數據表中字段屬性的約束,一般指數據的有效性,它包括字段的值域、字段的類型及字段的有效規則等約束,它是由肯定關係結構時所定義的字段的屬性決定的。限制數據類型,缺省值,規則,約束,是否能夠爲空,域完整性能夠確保不會輸入無效的值.。) 3. 參照完整性(參照完整性是對關係數據庫中創建關聯關係的數據表間數據參照引用的約束,也就是對外鍵的約束。準確地說,參照完整性是指關係中的外鍵必須是另外一個關係的主鍵有效值,或者是NULL。參考完整性維護表間數據的有效性,完整性,一般經過創建外部鍵聯繫另外一表的主鍵實現,還能夠用觸發器來維護參考完整性) 4. 用戶定義的完整性。 約束是表級的強制規定,有如下五中:not null,unique,primary key,foreign key,check 。 |
事務隔離級別 | 髒讀 | 不可重複讀 | 幻讀 |
讀未提交(read-uncommitted) | 是 | 是 | 是 |
不可重複讀(read-committed) | 否 | 是 | 是 |
可重複讀(repeatable-read) (mysql默認) | 否 | 否 | 是 |
串行化(serializable) | 否 | 否 | 否 |
(1)髒讀:事務A讀取到事務B未提交的數據(事務B回滾可怎麼辦)。安全
(2)不可重複讀:事務A在同一事務中屢次讀取同一數據,取到不一樣的值。(有其餘事務在A事務期間更新了這一數據、或刪除,致使)ide
(3)幻讀:事務A兩次讀取數據,返回的數據條數不一致(發生增長)atom
樂觀鎖並非數據庫自己實現的,他須要咱們本身去實現。spa
每次去拿數據的時候都認爲別人不會修改,因此不會上鎖,可是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可使用版本號等機制。樂觀鎖適用於多讀的應用類型,這樣能夠提升吞吐量,像數據庫提供的相似於write_condition機制,其實都是提供的樂觀鎖。在Java中java.util.concurrent.atomic包下面的原子變量類就是使用了樂觀鎖的一種實現方式CAS實現的。code
老是假設最壞的狀況,每次去拿數據的時候都認爲別人會修改,因此每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會阻塞直到它拿到鎖。傳統的關係型數據庫裏邊就用到了不少這種鎖機制,好比行鎖,表鎖等,讀鎖,寫鎖等,都是在作操做以前先上鎖。再好比Java裏面的同步原語synchronized關鍵字的實現也是悲觀鎖。orm
悲觀鎖涉及到另外兩個鎖概念,它們就是共享鎖與排它鎖。共享鎖和排它鎖是悲觀鎖的不一樣的實現,它倆都屬於悲觀鎖的範疇。
1)共享鎖:對於多個事務對同一資源共享一把鎖
在執行語句後面加上lock in share mode就表明對某些資源加上共享鎖了
2)排它鎖:對於多個事務對同一資源只能有一把鎖
在執行語句後面加上for update就表明對某些資源加上排它鎖了
對經過索引、主鍵查詢到的數據加鎖,會將這個索引所在的記錄加上鎖,若是經過條件查詢,會對多條記錄加上鎖。
若是不加索引,MySQL 會對掃描到的數據加鎖。(不肯定)
SpringMVC @Transactional 註解
@Transactional 在方法頭上註解,該方法被其餘方法內部調用,則不會生效。
另須要手動開啓事務用:
1 @Autowired 2 private PlatformTransactionManager transactionManager; 3 4 DefaultTransactionDefinition def=new DefaultTransactionDefinition(); 5 def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); // 事物隔離級別,開啓新事務,這樣會比較安全些。 6 TransactionStatus status = transactionManager.getTransaction(def); // 得到事務狀態 7 transactionManager.commit(status);//提交 8 transactionManager.rollback(status);//回滾