一、MySQL併發訪問控制
1.併發控制機制
(1)鎖機制
資源競爭時候,多個線程表示多個用戶會話;通過讀寫鎖機制實現
讀鎖:共享鎖,可以多個用戶同時讀取同一資源文件
寫鎖:獨佔鎖,當一個用戶對資源文件進行寫操作時,其他線程既不能讀也不能寫
(2)鎖粒度
表級鎖:對於整個表進行的鎖操作,併發處理有限,在線事務處理讀寫一樣多時會出問題
行級鎖:對於部分資源的鎖操作
(3)鎖策略
在鎖粒度及數據安全性尋求的平衡機制;每種存儲引擎都可以自行實現其鎖策略和鎖粒度;
MySQL在服務器級也實現了鎖,表級鎖;而Innodb自行實現了行級鎖,而無需人爲干預
(4)鎖分類
隱式鎖:由存儲引擎自動施加鎖;
顯式鎖:手動添加
2.命令行施加鎖
(1) LOCK TABLES tbl_name[[AS] alias] lock_type [, tbl_name [[AS] alias] lock_type] … READ[LOCAL] | [LOW_PRIORITY] WRITE
指明鎖定表和鎖類型,可一次指明多個表,還可以加別名;服務器層面表級別鎖
lock_type所類型:READ、WRITE
UNLOCKTABLES;
(2)FLUSH TABLEStb_name[,...] [WITH READ LOCK] [FOR UPDATE]
FLUSH 清理,把表寫到磁盤關閉再打開
UPDATE更新
(3) SELECT clase[FOR UPDATE] [WITH READ LOACK]
二、MySQL事務操作
1.ACID測試
A:atomicity,原子性;整個事務中的所有操作要麼全部成功執行,要麼全部失敗後回滾;
C:consistency,一致性;數據庫總是從一個一致性狀態轉換爲另一個一致性狀態;
I:Isolation,隔離性;一個事務所做出的操作在提交之前,是不能爲其它所見;隔離有多種隔離級別;
隔離級別越高,意味着數據安全性越高,但併發性越低
D:durability:持久性;一旦事務提交,其所做的修改會永久保存於數據庫中;
2.事務概念
事務是一組原子性的SQL查詢語句,是一個獨立工作單元。當操作需要多步驟完成時候,爲了保證安全或者數據完整性而引入的機制,其執行的一組語句要麼全部都執行,要麼在無法中斷時候能夠回顧,使得數據還原。
例如:銀行系統中的轉賬操作需要保證事務一致
3.事務流程
第一步:顯示啓動事務語句:START TRANSACTION;
...執行的SQL語句
...
第二步:結束事務方式:
(1) COMMIT:提交,寫入到數據庫文件中確保永久有效
(2) ROLLBACK: 回滾
注意:
1) 只有事務型存儲引擎方能支持此類操作;例如Inoodb支持事務、MyISAM不支持事務
2) 建議顯式請求和提交事務,而不要使用“自動提交autocommit”功能,每一次提交都會進行IO操作,降低系統性能
MariaDB[(none)]> SHOW GLOBAL VARIABLES LIKE 'autocommit';
autocommit={1|0},0表示關閉off
臨時修改實例:
MariaDB [(none)]> SET SESSIONautocommit=0; # 設置會話界別的自動提交
MariaDB[(none)]> SHOW VARIABLES LIKE'autocommit';
3) 事務支持savepoint(保存點),在進行中加入保存點可以指定點回滾,若無savepoint則必須回滾到起始處
SAVEPOINT identifier 指明標識符
ROLLBACK [WORK] TO[SAVEPOINT] identifier 回滾到標識點
RELEASE SAVEPOINTidentifier 刪除標識點
實例:
MariaDB[(none)]> SAVEPOINT sp1
MariaDB[(none)]> SAVEPOINT sp2
MariaDB[(none)]> SAVEPOINT sp3
MariaDB[(none)]> ROLLBACK TO sp2
4.事務隔離級別:mysql支持到第三級別
(1)隔離級別
READ UNCOMMITTED (讀未提交):問題一、二、三
READ COMMITTED (讀提交):問題二、三
REPEATABLE READ (可重讀):問題三
SERIALIZABILE (可串行化):問題四
注意:
隔離級別越低可能存在的問題可能性越大;可能存在問題:
問題一:髒讀 | 讀取到別人尚未提交的數據 |
問題二:不可重複讀 | 兩次讀取別人提交的數據不一致 |
問題三:幻讀 | 對方提交修改數據,自己在一次事務中認爲沒有發生變化 |
問題三:加鎖讀 | 加上鎖之後,其他用戶無法讀取 |
(2)修改隔離級別
MariaDB [(none)]> SHOWPROCESSLISTS; # 查看連接線程
註釋:
tx_isolation:服務器變量,默認爲REPEATABLE-READ;可在SESSION級進行修改;
MariaDB[(none)]>SETtx_isolation=''
READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ、SERIALIZABLE
注意:
可能會出現死鎖問題:兩個或多個事務在同一資源相互佔用,並請求鎖定對方佔用的資源的狀態;
各存儲引擎自己有死鎖檢測和死鎖超時機制,檢測死鎖的循環依賴發送錯誤通知
不能解決死鎖問題會導致查詢非常慢
4.事務日誌文件
(1)預寫式日誌
事務日誌幫助實現崩潰後揮發,是保證數據持久、回滾、提高事務效率的一個重要工具。
事務日誌的寫入類型爲"追加",不是修改數據,使用的是一段連續的空間,其操作爲"順序IO",避免了寫數據文件造成的大量隨機IO,保證快速的將提交的操作持久存儲在磁盤上,再刷寫到硬盤上;該日誌通常也被稱爲"預寫式日誌(writeahead logging)";
在Orcal中分爲:redolog、undolog重做日誌和撤銷日誌
(2)mysql事務日誌參數
innodb_log_file_size | 日誌文件大小 |
innodb_log_files_in_group | 同一組中有多少文件 |
innodb_log_group_home_dir | 一組日誌文件存放的位置,/表示mysql數據的工作目錄 |
innodb_log_buffer_size | 存儲日誌時的緩衝 |
innodb_log_block_size | 日誌塊的大小 |
注意:
1) 不支持運行修改,需要修改配置文件後重啓;
2) 建議不要使用太大的事務日誌空間,防止崩潰恢復
3) 不要混合使用不同的存儲引擎,因爲事務日誌是不一致的
4) 崩潰後的恢復時間取決於事務日誌的大小和其中所存儲的事務日誌的數量