mysql資料庫中的事務

2021-07-28 04:58:24 字數 3142 閱讀 4722

1. 什麼是事務:

事務中有多個操作,這些操作的執行結果要麼完全成功,要麼完全失敗,不可能出現一部分成功,一部分失敗的情況。比如說轉賬業務:張三給李四轉100w,那麼有兩個操作,乙個是張三減去100w,李四加上100w,兩個操作都成功,要麼都失敗,不能出現張三減了100w,李四沒有加上100w的情況。

2.事務的四種特性:

原子性:事務中的操作都是不可分割的原子單位,事務中所有的操作要麼全部成功,要麼全部失敗。

一致性:事務執行後,資料庫的狀態與他的業務規則應該保持不變。比如轉賬業務,轉賬前後,兩個賬戶的總額是不變的。

隔離性:隔離是在併發操作中,不同事務之間應該隔離開來,使得每個併發事務都互不干擾。

永續性:一旦事務提交成功,事務中所有的資料操作都必須被持久化到資料庫中,即使提交事務,資料庫馬上崩潰,在資料庫重新啟動完,資料庫中的資料也要保持不變。

3.與事務有關的幾個方法:

connection.setautocommit(boolean):設定事務是否自動提交,如果設定為true,自動提交,那麼每執行一條sql語句,就相當於執行乙個單獨的事務,就會自動提交,如果設定為false,那就相當於開啟了一條事務。

connection.commit():事務的提交。

connection.rollback():回滾事務。

4.jdbc處理事務的格式:

try catch()

5.事務的簡單例子:

以插入資料為例,同時執行插入兩條資料,這兩條資料要麼都成功插入到資料庫中,要麼都不能成功的插入到資料庫中。

publicint insertuser() catch (sqlexception e) catch(sqlexception e1)

throw newruntimeexception(e.getmessage());

}finally catch(sqlexception e)

try catch(sqlexception e)

}return count;

6.事務的隔離級別:

6.1事務的併發問題:

髒讀:讀到另乙個事務未提交的更新資料,即讀到了髒資料。

不可重複讀:兩次讀取同乙個資料讀到的結果不一樣。即另一事務修改了事務。

幻讀:對同一張表兩次讀到的資料不一樣,應為另一條事務插入了新的記錄。

6.2不可重複讀和幻讀的區別:

不可重複讀是讀取到了另一事務的更新;

幻讀是讀取到了另一事務的插入(mysql中無法測試到幻讀)

7.資料庫內部定義了四種隔離級別,用於解決三種隔離問題

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

2 repeatable read:可避免髒讀、不可重複讀情況的發生。(可重複讀)不可以避免虛讀

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

4 read uncommitted:最低級別,以上情況均無法保證。(讀未提交)

運算元據庫內部隔離級別

set session transaction isolation level 設定事務隔離級別

select @@tx_isolation   查詢當前事務隔離級別

實驗一:演示髒讀發生

在a視窗將隔離級別設定 read uncommitted

a、b視窗同時開啟事務

b視窗執行轉賬操作update account set money = money - 500 where name='bbb';

update account set money = money + 500 where name ='aaa'; 未提交事務

a視窗查詢 select *from account; 查詢到轉賬結果(髒讀)

b 回滾 rollback

a視窗查詢 金錢丟失

實驗二:演示不可重複讀

在a視窗設定隔離級別 read committed; 重複實驗一,發現無法髒讀

b視窗轉賬後,提交事務

a視窗查詢到 b提交的資料 (不可重複讀)

實驗三:演示阻止不可重複讀發生

在a視窗設定隔離級別 repeatable read 重複試驗二,發現不會發生不可重複讀

實驗四:演示serializable 序列事務效果

a視窗設定隔離級別serializable

a、b同時開啟事務

b視窗插入一條資料insert into account values(null,'ddd',1000);

在a視窗查詢資料 select * from account;

發現a 視窗阻塞了,等待b事務執行結束

安全性:serializable > repeatableread > read committed > read uncommitted

效能 :serializable < repeatable read < read committed < readuncommitted

結論: 實際開發中,通常不會選擇 serializable 和 read uncommitted , mysql預設隔離級別repeatable read ,oracle預設隔離級別 read committed

jdbc程式中能否指定事務的隔離級別 ?

connection介面中定義事務隔離級別四個常量:

static int transaction_read_committed

指示不可以發生髒讀的常量;不可重複讀和虛讀可以發生。

static int transaction_read_uncommitted

指示可以發生髒讀 (dirty read)、不可重複讀和虛讀 (phantom read) 的常量。

static int transaction_repeatable_read

指示不可以發生髒讀和不可重複讀的常量;虛讀可以發生。

static int transaction_serializable

指示不可以發生髒讀、不可重複讀和虛讀的常量。

通過 void settransactionisolation(intlevel) 設定資料庫隔離級別

mysql資料庫事務

維基百科 事務是資料庫管理系統 dbms 執行過程中的乙個邏輯單位,由乙個有限的資料庫操作序列構成。只有innodb和ndb 1 原子性 atomicity 事務中的全部操作在資料庫中是不可分割的,要麼全部完成,要麼全部不執行。2 一致性 consistency 幾個並行執行的事務,其執行結果必須與...

MySQL資料庫事務

文章出處 只有innodb引擎支援事務,下邊的內容均以innodb引擎為預設條件 1 髒讀 2 不可重複讀 3 幻讀 1 讀未提交 read uncommitted 可能產生髒讀 不可重複讀 幻讀 2 讀已提交 read committed 避免了髒讀,可能產生不可重複讀 幻讀 3 可重複讀 rep...

mysql資料庫事務

原子性 乙個事務 transaction 中的所有操作,要麼全部完成,要麼全部不完成,不會結束在中間某個環節 一致性 在事務開始之前和事務結束以後,資料庫的完整性沒有被破壞 隔離性 資料庫允許多個併發事務同時對其資料進行讀寫和修改的能力,隔離性可以防止多個事務併發執行時由於交叉執行而導致資料的不一致...