MySQL中不一樣存儲引擎支持不一樣方式的鎖,一般會進行自動管理。sql
MyISAM和Memory存儲引擎使用表級鎖,而InnoDB存儲引擎使用行級鎖。session
用於手動鎖定當前執行線程的表,簡單的語法爲:分佈式
LOCK TABLES table_name [READ|WRITE]
經過READ 或者 WRITE 來獲取讀鎖和寫鎖。spa
若是加鎖的時候已經被其餘線程鎖定,則會阻塞到其餘線程解鎖線程
READ鎖定後,當前線程不能夠寫入,其餘線程寫入會被阻塞到解鎖後執行,查詢不受影響。日誌
WRITE鎖定後,當前線程能夠插入查詢,其餘進行插入查詢會被阻塞到解鎖後執行。code
解除當前線程的全部鎖定,通常會話結束的時候會自動進行解鎖。事務
//設置自動提交 SET AUTOCOMMIT = 1 //開始事務 START TRANSACTION //提交事務 COMMIT //回滾事務 ROLLBACK //設置回滾點 SAVEPOINT point_name //回滾到指定回滾點 ROLLBACK TO SAVEPOINT point_name
爲了保證事務的一致性,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
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。