事務:指的是邏輯上的一組操做,組成這組操做的各個單元要麼全都成功,要麼全都失敗.mysql
事務做用:保證在一個事務中屢次操做要麼全都成功,要麼全都失敗.sql
事務特性:ACID數據庫
原子性(Atomicity)原子性是指事務是一個不可分割的工做單位,事務中的操做要麼都發生,要麼都不發生。 安全
一致性(Consistency)事務先後數據的完整性必須保持一致。 session
隔離性(Isolation)事務的隔離性是指多個用戶併發訪問數據庫時,一個用戶的事務不能被其它用戶的事務所幹擾,多個併發事務之間數據要相互隔離。併發
持久性(Durability)持久性是指一個事務一旦被提交,它對數據庫中數據的改變就是永久性的,接下來即便數據庫發生故障也不該該對其有任何影響。性能
併發訪問問題測試
若是不考慮隔離性,事務存在3中併發訪問問題。spa
1.髒讀:一個事務讀到了另外一個事務未提交的數據.線程
2.不可重複讀:一個事務讀到了另外一個事務已經提交(update)的數據。引起另外一個事務,在事務中的屢次查詢結果不一致。
3.虛讀 /幻讀:一個事務讀到了另外一個事務已經提交(insert)的數據。致使另外一個事務,在事務中屢次查詢的結果不一致。
隔離級別:解決問題
數據庫規範規定了4種隔離級別,分別用於描述兩個事務併發的全部狀況。
1. read uncommitted 讀未提交,一個事務讀到另外一個事務沒有提交的數據。
a)存在:3個問題(髒讀、不可重複讀、虛讀)。
b)解決:0個問題
2. read committed 讀已提交,一個事務讀到另外一個事務已經提交的數據。
a)存在:2個問題(不可重複讀、虛讀)。
b)解決:1個問題(髒讀)
3. repeatable read :可重複讀,在一個事務中讀到的數據始終保持一致,不管另外一個事務是否提交。
a)存在:1個問題(虛讀)。
b)解決:2個問題(髒讀、不可重複讀)
4. serializable 串行化,同時只能執行一個事務,至關於事務中的單線程。
a)存在:0個問題。
b)解決:3個問題(髒讀、不可重複讀、虛讀)
安全和性能對比
安全性:serializable > repeatable read > read committed > read uncommitted
性能 : serializable < repeatable read < read committed < read uncommitted
常見數據庫的默認隔離級別:
MySql:repeatable read
Oracle:read committed
查詢數據庫的隔離級別
show variables like '%isolation%';
或
select @@tx_isolation;
設置數據庫的隔離級別
set session transaction isolation level 級別字符串
級別字符串:read uncommitted、read committed、repeatable read、serializable
例如:set session transaction isolation level read uncommitted;
讀未提交:read uncommitted
關於幻象讀 ,innodb默認事務隔離級別是不會出現的;摘自網上,測試經過:
mysql> set autocommit=off;
Query OK, 0 rows affected (0.00 sec)
session 1 建立表並插入測試數據
mysql> create table test(i int) engine=innodb;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into test values(1);
Query OK, 1 row affected (0.00 sec)
session 2 查詢,沒有數據,正常,session1沒有提交,不容許髒讀
mysql> select * from test;
Empty set (0.00 sec)
session 1 提交事務
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
session 2 查詢,仍是沒有數據,沒有產生幻象讀
mysql> select * from test;
Empty set (0.00 sec)
數據庫併發控制並不複雜,交給數據庫的事務就行,mysql 選用innodb引擎,不會出現:「不可重複讀」(就是在事務1進行數據修改的時候,事務2讀取的數據是沒修改 以前的數據,事務1提交的時候,事務2再次讀取的時候獲得的是修改後的數據,單個事務內所讀數據不一致),「髒讀」,「幻象讀」;