Mysql深入了解 事務

2021-10-23 19:23:56 字數 1517 閱讀 3398

mysql是預設開啟事務,自動提交的

原子性 要麼都成功要麼都失敗

一致性 事務前後資料的完整性要保持一致 **賬前後都是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語句預設自動給表加上獨佔鎖

樂觀鎖的功能需要編寫程式實現,或使用orm框架(如hibernate / mybatis plus)提供的樂觀鎖配置功能

(1)select子句盡量使用列名,而不是*

(2)where子句中條件過濾的解析順序是從右向左的,對於and條件應盡量把可能為假的條件放在右邊,對於or條件應盡量把可能為真的條件放在右邊

(3)盡量使用where先過濾掉不滿足條件的記錄行,再分組

(4)多表連線時,盡量使用sql99的寫法,查詢優化而且結構清晰

(5)盡量使用多表連線查詢,而不要使用子查詢,因為子查詢要發出多條查詢語句,效率低

(8)給經常出現在where過濾條件的字段新增索引,以便加快查詢速度

深入了解事務的隔離機制

深入了解一下事務的隔離機制 在之前資料庫入門階段並沒有提到 我們說了,事務之間是相互隔離互不干擾的,那麼如果出現了下面的情況,會怎麼樣呢 當兩個事務同時在執行,並且同時在操作同乙個資料,這樣很容易出現併發相關的問題,比如乙個事務先讀取了某條資料,而另乙個事務此時修改了此資料,當前乙個事務緊接著再次讀...

Mysql深入了解 索引

為什麼b tree把data都移到葉子節點,並且增加雙向鍊錶?b tree比b tree的改進 將data移動到葉子節點,非葉子節點儲存的索引數變多,在高度相等的情況下,能儲存的data更多,查詢效率自然就高了 為什麼使用b tree而不使用紅黑樹或者跳表 區域性性原理 資料和程式都有聚集成群的侵向...

深入了解A

一 前言 在這裡我將對a 演算法的實際應用進行一定的 並且舉乙個有關a 演算法在最短路徑搜尋的例子。值得注意的是這裡並不對a 的基本的概念作介紹,如果你還對a 演算法不清楚的話,請看姊妹篇 初識a 演算法 這裡所舉的例子是參考amit主頁中的乙個源程式,使用這個源程式時,應該遵守一定的公約。二 a ...