mysql事务机制_MySQL系列:事务机制
一、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)崩潰后的恢復時間取決于事務日志的大小和其中所存儲的事務日志的數量
總結
以上是生活随笔為你收集整理的mysql事务机制_MySQL系列:事务机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 批量修改栏目名_必收APP-效率高不含糊
- 下一篇: mysql 多表备份_mysql备份与恢