MySql事務 Transaction
mysql是預設開啟事務,自動送出的
事務的原則—ACID
- 原子性 要麼都成功要麼都失敗
- 一緻性 事務前後資料的完整性要保持一緻 (轉賬前後都是1000)
- 持久性 一旦事務送出,那麼它對資料庫中的對應資料的狀态的變更就會永久儲存到資料庫中。(即使資料庫崩潰,一旦重新開機就會恢複到事務送出後的結果)
- 隔離性 事務的隔離性是多個使用者并發通路資料庫時,資料庫為每一個使用者開啟的事務,不能被其他事務的操作資料所幹擾,事務之間要互相隔離
不隔離所導緻的一些問題:
髒讀:一個事務讀取了另外一個未送出的事務,導緻破壞了事務一緻性
不可重複讀:多次讀取的結果是不一緻的
幻讀:是指一個事務讀到了别的事務插入的資料,導緻前後讀取不一緻
事務的四種隔離級别
- READ-UNCOMMITTED—讀未送出 一個資料可以讀取到其他事務未送出的事務,會出現髒讀,隔離級别最低
- READ-COMMITTED—讀已送出 讀取已送出的事務,不會出現髒讀,但由于資料可能被其他事務修改了,倆次讀取資料不一樣,出現不可重複讀現象
- REPEATABLE—可重複讀(預設的) 目前事務送出之前,看不到其他事務對資料的修改,保證倆次讀取是一樣的,但當事務結束後,查詢資料結果一定是不同的,出現幻讀
- SERIERLIZED—串行化 每個事務依次順序執行,目前事務送出前,其它事務無法執行任何操作,隻能等待,類似線程同步,隔離級别最高
鎖 悲觀鎖和樂觀鎖
悲觀鎖
共享鎖 —Share Lock
目前事務加上共享鎖後,其它事務對該資料隻能查詢不能修改,除非目前事務送出或復原
其它事務可以對這個資料再加共享鎖,但不能再加獨占鎖了
【加鎖方法】
select語句預設不加任何鎖,在語句末尾加上lock in share mode實作加共享鎖
update/insert/delete語句預設會自動加上表共享鎖
獨占鎖/排他鎖 —Exclusion Lock
目前事務給資料加上獨占鎖後,其它事務對該資料既不能查詢(隻能看到修改前的老資料),也不能修改,除非目前事務送出或復原
其它事務不能再對這個資料加任何類型的鎖
【加鎖方法】
==update/insert/delete語句預設會自動為操作涉及的行加上獨占鎖 ==
select語句末尾加上for update實作加獨占鎖
每一條DDL語句預設自動給表加上獨占鎖
樂觀鎖—optimistic Lock
樂觀鎖的功能需要編寫程式實作,或使用ORM架構(如Hibernate / MyBatis plus)提供的樂觀鎖配置功能
資料庫設計的三大範式
第一範式
- 表中所有列不可再分
第二範式
- 表中所有列都跟主鍵有關
第三範式
- 表中所有列僅跟主鍵有關
【企業面試題】SQL優化政策總結
(1)select子句盡量使用列名,而不是*
(2)where子句中條件過濾的解析順序是從右向左的,對于and條件應盡量把可能為假的條件放在右邊,對于or條件應盡量把可能為真的條件放在右邊
(3)盡量使用where先過濾掉不滿足條件的記錄行,再分組
(4)多表連接配接時,盡量使用SQL99的寫法,查詢優化而且結構清晰
(5)盡量使用多表連接配接查詢,而不要使用子查詢,因為子查詢要發出多條查詢語句,效率低
(8)給經常出現在where過濾條件的字段添加索引,以便加快查詢速度