8、MySQL中的事務、鎖和SQL_MODE - 系統的擼一遍MySQL

MySQL中不一樣存儲引擎支持不一樣方式的鎖,一般會進行自動管理。sql

MyISAM和Memory存儲引擎使用表級鎖,而InnoDB存儲引擎使用行級鎖。session

LOCK_TABLES

用於手動鎖定當前執行線程的表,簡單的語法爲:分佈式

LOCK TABLES table_name [READ|WRITE]

經過READ 或者 WRITE 來獲取讀鎖和寫鎖。spa

若是加鎖的時候已經被其餘線程鎖定,則會阻塞到其餘線程解鎖線程

READ鎖定後,當前線程不能夠寫入,其餘線程寫入會被阻塞到解鎖後執行,查詢不受影響。日誌

WRITE鎖定後,當前線程能夠插入查詢,其餘進行插入查詢會被阻塞到解鎖後執行。code

UNLOCK TABLES

解除當前線程的全部鎖定,通常會話結束的時候會自動進行解鎖。事務

事務控制

經常使用事務命令

//設置自動提交
SET AUTOCOMMIT = 1
//開始事務
START TRANSACTION
//提交事務
COMMIT
//回滾事務
ROLLBACK
//設置回滾點
SAVEPOINT point_name
//回滾到指定回滾點
ROLLBACK TO SAVEPOINT point_name

兩階段提交(2pc)

爲了保證事務的一致性,MySQL採用兩階段提交機制。it

首先調度方向數據方發送prepare T指令,數據方接受到後確承認以提交後,寫日誌同時返回ready T到調度方。io

調度方收集每個數據方的響應若是所有OK就發送commit T,各個數據放收到後將數據進行變動。若是響應結果爲not commit,則發送給數據方Abort T,這時候全部數據方進行數據回滾。

調度起開始兩階段提交的時候會生成xid用於標示一個惟一的分佈式事務。

XA START xid

XA END xid

XA PREPARE xid

XA COMMIT xid

XA ROLLBACK xid

SQL_MODE

MySQL能夠經過設置不一樣的SQL Mode來定義不一樣的SQL語法規則和數據校驗等。

//查看sql mode
select @@sql_mode
//設置sql mode
//本次連接生效
set session sql_mode = 'ANSI'
//新的連接中生效,本次無效
set global sql_mode = 'ANSI'

//設置嚴格模式
set global sql_mode = 'STRICT_TRANS_TABLES'
//設置嚴格模式 事務過程當中會致使事務回滾
set global sql_mode = 'TRADITIONAL'

設置嚴格模式後,對於  MOD(x/0),或者超過規定範圍的數據類型會出錯而不是提示Warnning。

相關文章
相關標籤/搜索