MySQL事務初識

本文首發於我的微信公衆號《andyqian》,期待你的關注 !

前言

  今天來講說MySQL事務,其實MySQL事務是一個比較廣且很是重要的概念。一篇文章確定是不夠描述的,先後會分爲好幾篇文章來寫這個專題,其中內容包括但不限於如下內容:數據庫

  1. 事務的概念。微信

  2. 事務的原則。併發

  3. MySQL中事務自動提交,手動提交以及回滾。工具

  4. 事務各個隔離級別的區別。spa

  5. MySQL中如何設置事務?修改默認事務默認級別。3d

  6. 事務與鎖的關係。排序

  7. 各種鎖之間的區別以及使用場景。 等等!索引

內容按部就班,在前面的章節,講解的都是比較大而全的概念,後面會掰開每一個細節來zhu說明。事務

什麼是事務?

  提及事務,其實你們都挺熟悉的,維基百科中是這樣描述的:ci

數據庫事務(簡稱:事務)是數據庫管理系統執行過程當中的一個邏輯單位,由一個有限的數據庫操做序列構成。事務一般包含一個序列的對數據庫的讀/寫操做。

既然說道了事務,就不得不說事務的四大特性了:

原子性(Atomicity):事務做爲一個總體,也就是說事務中的對數據庫的操做要麼所有被執行,要麼都不執行。例如: 我用銀行轉帳,從A帳戶轉帳到B帳戶, 這裏就存在A帳戶的扣減,B帳戶的添加。事務的原子性確定是A帳戶扣減後,必定在B帳戶上添加。

一致性(Consistency): 事務應確保數據庫的狀態從一個一致狀態轉變爲另外一個一致狀態。

隔離性(Isolation):多個事務併發執行時,一個事務的執行不該影響其餘事務的執行。(這裏還有很細節,在後續的文章中會詳細說明。)

持久性(Durability):已被提交的事務對數據庫的修改應該永久保存在數據庫中,好比修改操做,事務提交後,就會永久修改。也就是說:開啓事務後在沒提交前,回滾是有效的。 例如:

begin;
  update t_base_user name="鞠騫",updated_at=now() where oid=1;
rollback;

這個時候才能回滾。
例如:

begin;
  update t_base_user name="鞠騫",updated_at=now() where oid=1;
commit;
rollback;

上面回滾是無效的。由於事務已提交,已經持久化了。此時回滾是無心義的。

MySQL設置自動提交

  其實在MySQL  InnoDB存儲引擎中,默認是開啓事務的。固然咱們也能夠經過命令來設置開啓與禁用自動提交。

顯示MySQL設置:

show variables like "autocommit";

結果:

Variables_name value
autocommit ON

 

咱們也能夠經過下面命令來設置該屬性的值。

set autocommit = 0;

來禁用自動提交。(注意不會當即生效)!

經過

set autocommit = 1;

命令來開啓自動提交模式。

如何顯示開啓事務

  MySQL中也提供了一系列命令來控制手動的開啓,提交,回滾事務操做。下面咱們一一來介紹。

開啓事務: 使用start transaction;或者begin;開啓一個新的事務;

提交事務: commit,提交當前事務,使其持久化;

回滾事務: rollback,回滾當前事務。

下面舉個例子:

begin;
  update t_base_user name="鞠騫",updated_at=now() where oid=1;
commit;

咱們知道經過 begin;或 start transaction 命令只是開啓了一個事務,若是沒有commit;的話,其實對數據是沒有真正的修改的,(咱們可使用Navicat工具,同時開啓兩個查詢窗口來驗證)。

今日命令

  今天給你們介紹的命令是:show index from table_name;
做用: 顯示該表中的全部索引信息。
例如:

show full index from t_base_user;

顯示結果以下:

Table:顧名思義,就是表名。
Non_unique: 0表示無重複項, 1表示容許重複。如主鍵,惟一索引則爲0。
Key_name: 索引的名字,這裏須要注意的是,除了自定義索引名字外,還有幾個固定值: 如主鍵: PRIMARY。
Seq_in_index: 表示索引中的序號,值得注意的是,該字段從1開始。聯合索引。如:

alter table t_base_user add index idx_email_name(email,name);

像上述這種,此時的email的Seq_in_index就是1,name的Seq_in_index就是2。

Column_name:索引列名。
Collation:表示如何在索引中對列進行排序。這能夠具備值A(升序)或NULL(不排序) Cardinality:根據以整數存儲的統計數字進行計數。(參考值)。該基數越大,說明其命中索引的機率越大。
Sub_part: 索引前綴。也就是說,若是列只是部分索引,則索引字符的數量,若是整列索引,則爲NULL。
Null :表示該索引是否容許NULL,若是容許則爲YES,不然爲''。
Index_type:索引類型,常見有類型有(BTREE, FULLTEXT(全文), HASH(哈希),RTREE)。

Comment :備註信息。

Index_comment : 索引備註信息。建立時的信息,如:

alter table t_base_user add index idx_email_name(email,name) comment "remark";

此時的"remark"內容,就會顯示在此處。

相關閱讀:

寫會MySQL索引

讀懂MySQL執行計劃

談談MySQL隱式類型轉換

掃碼關注,一塊兒進步

我的博客: http://www.andyqian.com

相關文章
相關標籤/搜索