數據庫 鎖問題
MyISAM 只有表鎖
讀鎖 也叫共享鎖
MyISAM表查詢會加表鎖 致使其餘的 inster update 等待
lock tables 表 read|write; 加鎖 unlock tables;解鎖
MyISAM 上了寫鎖 其餘都須要等待 這個寫鎖也加 排它鎖
select 上 排它鎖 select * from 表 for update;
innoDB 有表鎖 有行鎖
查看是否自動提交事務後解鎖 show variables like 'autocommit';
關閉自動提交 set autocommit = 0 ;(只針對當前session(一個窗口一個sql session),)
另外一個 begin transaction ; sql ; commit;(打開事務)
事務提交後 會自動釋放鎖。(事務和鎖倆個概念,事務常常用,鎖通常自動控制了,也可手動干預加鎖解鎖)
查詢上讀鎖 select * from 表 lock in share mode;(非共享讀鎖)
手動實現樂觀鎖
給數據價格version字段 默認爲0 代碼裏面首先讀到id=1 的 version 爲0 更新時set version = 0+1 而且where條件爲 id=1 and version = 0 ,
另外一個程序假如執行過查詢version 爲0 並更新 set version = 0+ 1 where id=1 and version = 0 後,數據庫的 id= 1的version = 1了,那麼第一個 更新的sql就更新影響行數爲0,使用業務代碼來判斷失敗就能夠了。
數據庫事務的四大特效
持久性 對事務的提交保存,是會被完整記錄到的,不會提交了事務 忽然斷電數據未更新的狀況~~~ innoDB數據庫重啓時會在 redo log file 文件中對事務進行重作!!!
查看session隔離級別 select @@tx_isolation;
設置當前session 的隔離級別 set session transaction isolation level read uncommitted;
read uncommitted(未提交讀)
MySql事務開始BEGIN和START TRANSACTION網上都很多人使用,到底它們有什麼區別呢,如下是一些經常使用的用法;
事務的開始: BEGIN或START TRANSACTION都是顯式開啓一個事務; 事務的提交: COMMIT或COMMIT WORK都是等價的; 事務回滾: ROLLBACK或ROLLBACK WORK也是等價的;mysql
RC[已提交讀]read committed 設置隔離級別爲 已提交讀 (也叫‘讀寫提交’ 能夠解決髒讀問題,是oracle的默認隔離級別)set session transaction isolation level read committed;
RR[可重複讀]repeatable read 設置隔離級別爲innoDB的默認隔離級別 可重複讀 set session transaction isolation level repeatable read;
設置隔離級別爲最高級 串行化 set session transaction isolation level serializable ;能夠解決幻讀。!
mysql innoDB的可重複讀 如何 避免幻讀的呢?
快照度就是普通的select 會幻讀髒讀等等(非串行化的隔離級別下)
當前度就是加鎖的 select 和 update, delete, inster , select...lock b share mode,select...for update
read view mysql的可見性算法 是用來結合undo log和這一行數據的隱層列作判斷大小,來實現是顯示快照度仍是當前讀
擴展 mvcc 多版本併發控制讀不加鎖 讀寫無衝突 !!併發性能max (mysql實現僞mvcc)
Gap鎖
gap鎖會對非惟一索引 的 區間加鎖 ,該區間爲左開右閉的區間,好比 update 表 set vip = true where Money > 10000 and Moneny < 30000 的 sql ,會對 Money字段索引的中的 (10000,30000]區間加鎖, 這個區間的列的 id 彙集索引也會有這個gap鎖,這個區間的 列都會有鎖, 而區間外的 sql 就不會有鎖例如 :inster 表 values(xxxx) [表中有money>30000 的數據 id > (select id from biao where money=30000) 的 插入 ,能夠直接執行, update where money <5000 的 sql也不會 有鎖,大大提升了 批量更新操做的 併發性 。。。。我的理解,一樣也是爲了不幻讀的發生!!!]