1.什么是數(shù)據(jù)庫的事務(wù)?
數(shù)據(jù)庫事務(wù)的典型場景?
訂單,轉(zhuǎn)賬 支付,電商等全部成功/全部不成功。金融
什么是事務(wù)?
數(shù)據(jù)庫的最小工作單元,不可分割,一個(gè)DML或多個(gè)
哪些存儲(chǔ)引擎支持事務(wù)?
InnoDB 版本5.5.5以后的 數(shù)據(jù)的一致性 MyIsam 不支持 BDB支持
事務(wù)的四大特性?
ACID
原子性: undo log實(shí)現(xiàn) 記錄數(shù)據(jù)修改之前的值
一致性 完整性的約束有沒有破壞,合法的數(shù)據(jù)狀態(tài),字段長度,主鍵唯一,類型都是合法,用戶自定義的完整性
隔離性 透明的互相不干擾的
持久性 對數(shù)據(jù)庫任意的操作(增刪改) 永久性的不能因?yàn)橹貑⒕透牧?br>
redo log ---寫到buffer pool(在內(nèi)存中)
數(shù)據(jù)庫什么時(shí)候出現(xiàn)事務(wù)?
update brower set Bro_Pro_username = 'zhangsan' where Bro_id = 165;
Start TRANSACTION;
begin;
update brower set Bro_Pro_username = 'lisi' where Bro_id = 165;
rollback;
show VARIABLES LIKE 'autocommit';
set session autocommit = on;
update brower set Bro_Pro_username = 'wangwu' where Bro_id = 165;
commit;
--事務(wù)結(jié)束的時(shí)候,所持有的鎖就會(huì)釋放
事務(wù)并發(fā)會(huì)帶來什么問題?
?問題 為什么會(huì)出現(xiàn)查詢兩次數(shù)據(jù)時(shí)出現(xiàn)數(shù)據(jù)不一致的情況
臟讀:
在一個(gè)事務(wù)里面前后兩次讀取數(shù)據(jù)不一致,是由于其他的事務(wù)操作了數(shù)據(jù)并且沒有提交的數(shù)據(jù)就是臟讀;

不可重復(fù)讀:
一個(gè)事務(wù)前后兩次讀取數(shù)據(jù)發(fā)生不一致的情況是由于其他的事務(wù)中間操作的數(shù)據(jù)并且提交了的這種情況。

幻讀:只有插入才是幻讀

不可重復(fù)讀和幻讀的區(qū)別?
不可重復(fù)讀是更新和刪除,而幻讀是插入數(shù)據(jù)導(dǎo)致數(shù)據(jù)行不同
總結(jié)
事務(wù)并發(fā)的三大問題其實(shí)都是數(shù)據(jù)庫一致性問題,必須由數(shù)據(jù)庫提供一定的事務(wù)隔離機(jī)制來解決。
事務(wù)的四種隔離級別
SQL92 ANSI/ISO標(biāo)準(zhǔn)
http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt
未提交讀 ----未解決任何并發(fā)問題
事務(wù)未提交的數(shù)據(jù)對其他事務(wù)也是可見的,會(huì)出現(xiàn)臟讀
已提交讀 ----解決臟讀問題
一個(gè)事物開始之后,只能看到已提交的事務(wù)所做的修改,會(huì)出現(xiàn)不可重復(fù)讀
可重復(fù)讀 ----解決不可重復(fù)讀問題
在同一個(gè)事務(wù)中多次讀取同樣的數(shù)據(jù)結(jié)果是一樣的,這種隔離級別未定義解決幻讀的問題
串行化 ----解決所有問題
最高的隔離級別,通過強(qiáng)制事務(wù)的串行執(zhí)行。

如何要解決讀一致性的問題,保證一個(gè)事務(wù)中前后兩次讀取數(shù)據(jù)結(jié)果一致,實(shí)現(xiàn)事務(wù)隔離,應(yīng)該怎么做?
第一種:在讀取數(shù)據(jù)前,對其加鎖,防止其他事務(wù)對數(shù)據(jù)進(jìn)行修改(LBCC)
第二種:生成一個(gè)數(shù)據(jù)請求時(shí)間點(diǎn)的一致性數(shù)據(jù)快照,并用這個(gè)快照來提供一定級別(語句級或事務(wù)級)的一致性讀?。∕VCC)
協(xié)同使用
2.MySQL InnoDB 鎖的基本類型

myisam支持表鎖 innodb支持表鎖和行鎖
加鎖效率 -- 表鎖>行鎖
沖突概率 -- 表鎖>行鎖
并發(fā)性能 -- 表鎖<行鎖

行級別鎖:
共享鎖:
多個(gè)事務(wù)對于同一數(shù)據(jù)可以共享一把鎖,都可以訪問到數(shù)據(jù),但是只能讀數(shù)據(jù)不能修改
讀數(shù)據(jù)時(shí)修改數(shù)據(jù)會(huì)出現(xiàn)死鎖
加鎖釋鎖方式:
select * from emp where emptno = 1 LOCK IN SHARE MODE;
釋放 :
commit/rollback;
排他鎖:
寫鎖,排他鎖不能與其他鎖共存,如一個(gè)事務(wù)獲取了一個(gè)數(shù)據(jù)行的排他鎖,其他事務(wù)就不能再獲取該行的鎖(共享鎖、排他鎖),只有該獲取了排他鎖的事務(wù)可以對數(shù)據(jù)進(jìn)行讀取和修改
和任意的鎖都是沖突的
實(shí)現(xiàn):
自動(dòng):delete/update/insert 默認(rèn)加上X鎖
手動(dòng):select * from emp where emptno = 1 for update;
commit/rollback
表級別的鎖
意向共享鎖/意向排他鎖
嘗試去鎖住一張
前提:沒有其他任何一個(gè)事務(wù)鎖住了這張表的任何一行數(shù)據(jù)
鎖的作用?
用來解決事務(wù)不同事務(wù)競爭并發(fā)
鎖到底鎖住了什么?
是一行數(shù)據(jù)嗎?
是一個(gè)字段嗎?
4.行鎖的原理與算法詳解
1.無索引時(shí)
第一行數(shù)據(jù)加鎖
第三行數(shù)據(jù)加鎖失敗
沒有索引的時(shí)候?yàn)槭裁磿?huì)導(dǎo)致鎖表?
一張表有沒有可能沒有主鍵索引,如果沒有會(huì)創(chuàng)建默認(rèn)索引,全表的掃描
2.主鍵索引
唯一索引和主鍵索引的區(qū)別
主鍵是一種約束,唯一索引是一種索引,兩者在本質(zhì)上是不同的。
主鍵創(chuàng)建后一定包含一個(gè)唯一性索引,唯一性索引并不一定就是主鍵。
唯一性索引列允許空值,而主鍵列不允許為空值。
主鍵列在創(chuàng)建時(shí),已經(jīng)默認(rèn)為空值 + 唯一索引了。
主鍵可以被其他表引用為外鍵,而唯一索引不能。
一個(gè)表最多只能創(chuàng)建一個(gè)主鍵,但可以創(chuàng)建多個(gè)唯一索引。
主鍵更適合那些不容易更改的唯一標(biāo)識(shí),如自動(dòng)遞增列、身份證號等。
在 RBO 模式下,主鍵的執(zhí)行計(jì)劃優(yōu)先級要高于唯一索引。 兩者可以提高查詢的速度。
為什么第一個(gè)事務(wù)鎖住name,會(huì)阻塞第二個(gè)事務(wù)鎖住id呢?
鎖住索引
什么是索引?
算法
記錄鎖:
唯一性索引(唯一/主鍵) 等值查詢,精準(zhǔn)匹配
間隙鎖
記錄不存在 間隙的區(qū)間不可變
臨鍵鎖
范圍查詢,包含記錄和區(qū)間