目錄
1、事物有哪些基本要素/或者有哪些必須滿足的條件?
2、多執行緒操作事物時,存在哪幾種問題?
3、針對多執行緒操作事物存在的問題,事物分哪幾種 隔離級別?
4、mysql 鎖 和 mvcc?
5、mysql資料結構為什麼是b+樹?
這篇文章後續補充完整。
原子性:乙個事物的所有操作,要麼全部成功,要麼全部失敗,不會結束在中間某個環節。事物在執行過程中,某個環節執行失敗了,會進行回滾,回到事物執行前的狀態。
一致性:事物開始前和結束後,資料庫的完整性約束沒有被破壞,資料不存在中間狀態,比如a向b轉賬,不可能存在a扣了錢,b沒收到的資料狀態。
隔離性:資料庫允許多個併發事務同時對其資料進行讀寫和修改的能力,隔離性可以防止多個事務併發執行時由於交叉執行而導致資料的不一致。
[同一時間,只允許乙個事務請求同一資料,不同的事務之間彼此沒有任何干擾]
事務隔離分為不同級別,包括讀未提交(read uncommitted)、讀提交(read committed)、可重複讀(repeatable read)和序列化(serializable)。
永續性:事務處理結束後,對資料的修改就是永久的。
髒讀:指乙個事物在處理過程中,讀取了另乙個事物未提交的資料。
不可重複讀:
指對資料庫中同乙個資料,乙個事物在執行過程中多次查詢,返回了不同的資料值,這是由於該資料被另外乙個事物修改了(區別於髒讀,另外乙個事物是已修改並提交)
[讀到了被更新的資料]
幻讀:指當前事物讀取了另乙個事物提交的 [新增] 資料。區別於不可重複讀,例:乙個資料第一次讀,沒有;第二次讀,突然有了。
事務隔離級別
髒讀不可重複讀
幻讀未提交讀(read-uncommitted)是是
是未提交讀(read-committed)否是
是可重複讀(repeatable-read)否否
是序列化讀(serializable)否否
否未提交讀:允許讀取未提交事物修改的資料,因此無法避免髒讀、不可重複讀和幻讀問題
已提交讀:只能讀取到已提交的資料。僅能避免髒讀問題,是多數資料庫的預設級別
可重複讀:指乙個事務過程中,該事務讀取到的資料,都是事務開始時的資料快照,innodb預設級別,可避免髒讀、不可重複讀問題
序列化讀:完全序列化的讀,每次讀都需要獲得表級共享鎖,讀寫互相阻塞
mysql 鎖分類:
表鎖:對整表加鎖,分讀鎖和寫鎖,會導致併發能力下降
行鎖:對資料行加鎖,併發能力強
mvcc 多版本併發控制
用途:普通讀 不加鎖;並且讀寫不衝突,避免讀操作的加鎖解鎖耗時
參考:上文我們已經說明單個葉子節點(頁)中的記錄數=16k/1k=16。(這裡假設一行記錄的資料大小為1k,實際上現在很多網際網路業務資料記錄大小通常就是1k左右)。
那麼現在我們需要計算出非葉子節點能存放多少指標,其實這也很好算,我們假設主鍵id為bigint型別,長度為8位元組,而指標大小在innodb原始碼中設定為6位元組,這樣一共14位元組,我們乙個頁中能存放多少這樣的單元,其實就代表有多少指標,即16384/14=1170(非葉子節點數)。那麼可以算出一棵高度為2的b+樹,能存放1170*16=18720條這樣的資料記錄。
根據同樣的原理我們可以算出乙個高度為3的b+樹可以存放:1170*1170*16=21902400條這樣的記錄。所以在innodb中b+樹高度一般為1-3層,它就能滿足千萬級的資料儲存。在查詢資料時一次頁的查詢代表一次io,所以通過主鍵索引查詢通常只需要1-3次io操作即可查詢到資料。
不使用b樹原因?
因為b樹不管葉子節點還是非葉子節點,都會儲存資料,這樣導致在非葉子節點中能儲存的指標數量變少(有些資料也稱為扇出),指標少的情況下要儲存大量資料,只能增加樹的高度,導致io操作變多,查詢效能變低;
mysql索引和事務 MySql索引和事務
mysqlde 索引 目的 是為了加快查詢的速度,避免順序查詢,但是拖慢了插入和刪除的速度.應用在在經常查詢,很少少出插入的場景中.結構 b 樹,n叉搜尋樹,使用鏈式的結構把每一層的節點連線在一起,葉子節點中儲存資料,非葉子節點輔助查詢.主鍵索引和其他索引的不一樣 主鍵索引葉子節點儲存一條一條的資料...
mysql事務索引 mysql事務索引和許可權管理
pysql sql注入 太相信使用者輸入的所有的資料。解決方法 1.自己手動去判斷轉義使用者輸入的資料2.不要拼接sql語句,使用pymysql 的execute方法,防止sql的注入。事務 一組操作,要麼都成功要麼都失敗 四大特性 1.原子性 原子是最小的粒度,所以說一組操作要麼都 成功要麼都失敗...
學習Mysql事務筆記
l事務的概念 事務指邏輯上的一組操作,組成這組操作的各個單元,要不全部成功,要不全部不成功。例如 a b轉帳,對應於如下兩條sql語句 update from account set money money 100 where name b update from account set money...