1. 程式人生 > >資料庫:事務

資料庫:事務

目錄

一、儲存引擎

1.什麼是儲存引擎?

2.常見的儲存引擎有哪些?

3.如何檢視和設定儲存引擎?

二、mysql字符集編碼

1.檢視字符集編碼

2.修改字符集編碼

三、事務

1.什麼是事務?

2.開啟和提交事務?

3.事務的ACID特性(面試經常問)

4.併發事務產生的問題

5.設定事務隔離級別

6.檢視和修改事務隔離級別


一、儲存引擎

1.什麼是儲存引擎?

資料庫儲存引擎是資料底層軟體組織,規範了資料底層的組織方式、鎖水平、索引策略等。不同的儲存引擎提供不同的儲存機制、索引技巧、鎖定水平等功能,使用不同的儲存引擎還可以獲得特定的功能。

資料庫管理系統(DBMS)使用資料儲存引擎進行建立、查詢、更新和刪除資料。

mysql的核心就是儲存引擎。mysql是外掛式資料庫,支援外掛式儲存引擎,mysql5.5之後預設使用InnoDB儲存引擎。什麼是外掛式?可以切換功能元件,比如mysql可以切換儲存引擎。

2.常見的儲存引擎有哪些?

InnoDB:事務型資料庫首選的儲存引擎,安全效能高,支援行鎖定,支援外來鍵。

myisam:插入速度和查詢效率較高,但不支援事務。

memory:資料儲存於記憶體,查詢效率高。

功能 myisam memory InnoDB Archive
儲存限制 256TB RAM 64TB None
支援事務 No No Yes No
支援全文索引 Yes No No No
支援數索引 Yes Yes Yes No
支援雜湊索引 No Yes No No
支援資料快取 No N/A Yes No
支援外來鍵 No No Yes No

3.如何檢視和設定儲存引擎?

#檢視索引

show engines;

#在mysql配置檔案my.ini中修改,如下,然後重啟mysql服務即可生效

default-storage-engine=INNODB

二、mysql字符集編碼

1.檢視字符集編碼

#character_set_client

#character_set_connection

#character_set_database

#character_set_filesystem

#character_set_results

#character_set_server

#character_set_system

show variables like '%char%';

2.修改字符集編碼

步驟:

  • 關閉mysql服務:net stop mysql(windows命令)
  • 修改my.ini配置檔案:
    • [client]    default-character-set=utf8
    • [mysql]    default-character-set=utf8
    • [mysqld]    character-set-server=utf8 和 collation-server=utf8_general_ci
  • 啟動mysql服務:net start mysql

三、事務

1.什麼是事務?

一組DML操作要麼同時成功,要麼同時失敗。

2.開啟和提交事務?

語法格式:

#關閉mysql自動提交事務
set autocommit = 0;
#開啟事務
start transaction;
#業務
……
commit;#提交:將事務持久化到資料庫
rollback;#回滾:恢復到開始事務之前的狀態

注意事項:

  • dml操作必須在事務環境執行。
  • mysql預設自動提交事務,比如單句DML操作就是這樣。
  • set autocommit=0; #關閉mysql自動提交事務。

3.事務的ACID特性(面試經常問)

原子性:事務內的DML操作必須整體成功或整體失敗。

一致性:事務執行前後整體狀態變,比如表結構,欄位約束等。

隔離性:併發事務之間不能產生干擾。

永續性:事務提交後將持久化到資料庫。

4.併發事務產生的問題

多個執行緒開啟各自的事務操作資料庫中的資料時,資料庫系統要負責隔離操作,以保證各個執行緒在獲取資料時的準確性。如果不考慮隔離性,可能會引發如下問題:

髒讀:一個事務讀(t1)到另一個事務(t2)提交的資料,則t1髒讀了資料。針對同一條記錄。

不可重複讀:一個事務(t1)在可讀範圍內,多次讀取發現數據不一致,原因是另一個事務(t2)在此過程中修改了該資料並提交了事務,則t1重複讀了資料。針對同一條記錄。重點在於修改。

幻讀:一個事務(t1)可讀範圍內,多次讀取發現數據新增或減少,原因是另一個事務(t2)在此過程中新增或刪除記錄並提交事務,則t1出現幻讀。針對多條記錄。重點在於插入或刪除。

5.設定事務隔離級別

資料庫定義了4中隔離級別:

Read uncommitted(讀未提交):最低級別,以上情況均無法保證,不能解決任何問題。

Read committed(讀已提交):可避免髒讀情況發生。

Repeatable read(可重複讀):可避免髒讀、不可重複讀情況的發生。

Serializable(序列化):可避免髒讀、不可重複讀、幻讀情況的發生。

Oracle支援2種事務隔離級別:Read committed 和 Serializable,預設是Read committed。

mysql支援4種事務隔離級別,預設是Repeatable read。

 

6.檢視和修改事務隔離級別

#檢視

select @@tx_isoation;

#修改

set session transaction isoaiton level 值;