鏈接管理器:mysql
接受請求sql
建立線程數據庫
認證用戶緩存
創建安全鏈接安全
解析器生成解析樹服務器
緩存:有些狀況並不適合緩存併發
1)不肯定的結果,select current_time();ide
2)數據較小,緩存後佔據緩存槽性能
3)數據較大,不宜緩存spa
併發控制:兩個以上的用戶同時讀寫同一個文件,都會涉及併發控制問題。
10分鐘:
多版本併發控制: MVCC,不一樣用戶建立不一樣的數據快照,根據操做的時間進行合併。
鎖,最簡單的控制機制
讀鎖:共享鎖
寫鎖:獨佔鎖
LOCK TABLES tb_name {READ|WRITE};
UNLOCK TABLES
鎖粒度:從大到小,MySQL服務器僅支持表級鎖,行鎖須要由存儲引擎完成;
表鎖:鎖定整張表
頁鎖:鎖定datablock
行鎖:鎖定某行
事務
多項操做做爲一個操做單元對待,都完成或者都不完成
RDBMS: 支持事物的RDBMS要知足ACID
1)原子性,Automicity,事務所引發的數據庫操做,要麼都完成,要麼都不執行;
2)一致性,Consistency,
3)隔離性,Isolation,事務調度:事務之間影響最小;MVCC:multi version control多版本併發控制
4)持久性,Durability,一旦事務成功完成,系統必須保證任何故障都不會引發事務表示出不一致性;
a)事務提交以前就已經寫出數據至持久性存儲;
b)結合事務日誌完成;
事務日誌:順序IO,存儲到連續的磁盤塊,IO操做少,速度快
數據文件:隨機IO,存儲到不連續磁盤塊,IO操做多,速度慢
事物的完成,先寫入事物日誌,而後才操做數據文件。事物提交了即完成。
事物日誌:
1)重作日誌,redo log,可執行n次
2)撤銷日誌,undo log,
日誌組:含兩個日誌文件,兩個日誌文件輪流寫入,但文件不適宜很大,合適的大小能保證及時將數據寫入磁盤;
數據和日誌不能放在同一塊物理磁盤上,防止一損俱損
隔離性,隔離級別(級別從低到高,級別越高,併發性能越差)
READ UNCOMMITTED:讀未提交,讀還沒有提交的數據,干擾最大
READ COMMITTED:讀提交,讀已經提交的數據
REPATABLE READ:可重讀,一直到事物commit前保持本身的首次狀態,mysql默認
SERIALIZABLE:可串行
查看默認隔離級別
mysql> show global variables like '%isolation';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| tx_isolation | REPEATABLE-READ |
+---------------+-----------------+
服務器變量
1)重啓mysql後失效,reload不失效
全局變量,修改後不影響當前會話,只對新建的會話有效;
會話變量,僅對當前會話有效,並且是當即生效;
2)永久有效:修改配置文件
修改:SET {SESSION|GLOBAL} VAR_NAME=‘’;
mysql> set global tx_isolation='read-uncommitted';
事物的執行
start transaction,啓動
rollback,提交前可回滾
commit,提交後不可回滾
mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
| 1 |
+--------------+
若是沒有明確啓動事務:
autocommit:能實現自動提交,每個操做都直接提交;
建議:明確使用事務,而且關閉自動提交;在my.cnf [mysqld]中加入autocommit = 0重啓mysqld
做爲調優的一部分,較少IO操做
事物的狀態
活動的:active
部分提交:最後一條語句處於將數據寫入磁盤的過程當中
失敗的:正常提交後,未能完成
停止的:部分執行完成
提交的:
提交後沒法撤消。
事務:併發執行
1)提升吞吐量和資源利用率
2)減小等待時間
事務調度:
1)可恢復調度,任何兩個事物的交叉執行,不會致使另外的事物狀態改變;但並不表明回滾時沒有任何影響
2)無級聯高度
併發控制依賴的技術手段:
鎖,讀鎖,寫鎖
時間戳,記錄事物的啓動時間和執行時間
多版本和快照隔離
鎖飢餓,一直獲取不到鎖
死鎖,一直持有鎖
保存點:SAVEPOINT savepoint_id
回滾至保存點以前:ROLLBACK TO savepoint_id