国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【mysql】事務(wù)的四種特性的理解

這篇具有很好參考價值的文章主要介紹了【mysql】事務(wù)的四種特性的理解。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

??個人主頁:平凡的小蘇
??學(xué)習(xí)格言:命運給你一個低的起點,是想看你精彩的翻盤,而不是讓你自甘墮落,腳下的路雖然難走,但我還能走,比起向陽而生,我更想嘗試逆風(fēng)翻盤。
??Mysql專欄Mysql內(nèi)功修煉基地
> 家人們更新不易,你們的??點贊??和?關(guān)注?真的對我真重要,各位路 過的友友麻煩多多點贊關(guān)注。 歡迎你們的私信提問,感謝你們的轉(zhuǎn)發(fā)! 關(guān)注我,關(guān)注我,關(guān)注我,你們將會看到更多的優(yōu)質(zhì)內(nèi)容!!

【mysql】事務(wù)的四種特性的理解,mysql修煉內(nèi)功基地,mysql,數(shù)據(jù)庫

一、事務(wù)的概念

1、事務(wù)的四種特性

事務(wù)就是一組DML語句組成,這些語句在邏輯上存在相關(guān)性,這一組DML語句要么全部成功,要么全部失敗,是一個整體。例如銀行轉(zhuǎn)賬操作,上層看來是一個單純的轉(zhuǎn)賬操作,但是下層卻需要一條或多條SQL語句來完成轉(zhuǎn)賬操作,這一組SQL是一個整體,被稱為事務(wù)。事務(wù)還規(guī)定不同的客戶端看到的數(shù)據(jù)是不相同的。

一個 MySQL 數(shù)據(jù)庫,可不止你一個事務(wù)在運行,同一時刻,有大量的請求被包裝成事務(wù),向 MySQL 服務(wù)器發(fā)起事務(wù)處理請求。如果多名用戶都訪問同樣的表數(shù)據(jù),在不加保護(hù)的情況,絕對會出現(xiàn)問題。并且事務(wù)由多條 SQL 構(gòu)成,也會存在執(zhí)行到一半出錯或者不想再執(zhí)行的情況,那么已經(jīng)執(zhí)行的怎么辦呢?

所以一個完整的事務(wù),絕對不是簡單的 sql 集合,還需要滿足如下四個屬性:

原子性:一個事務(wù)(transaction)中的所有操作,要么全部完成,要么全部不完成,不會結(jié)束在中間某個環(huán)節(jié)。事務(wù)在執(zhí)行過程中發(fā)生錯誤,會被回滾(Rollback)到事務(wù)開始前的狀態(tài),就像這個事務(wù)從來沒有執(zhí)行過一樣。

一致性:在事務(wù)開始之前和事務(wù)結(jié)束以后,數(shù)據(jù)庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預(yù)設(shè)規(guī)則,這包含資料的精確度、串聯(lián)性以及后續(xù)數(shù)據(jù)庫可以自發(fā)性地完成預(yù)定的工作。 原子性、隔離性、持久性是因,一致性是果。

隔離性:數(shù)據(jù)庫允許多個并發(fā)事務(wù)同時對其數(shù)據(jù)進(jìn)行讀寫和修改的能力,隔離性可以防止多個事務(wù)并發(fā)執(zhí)行時由于交叉執(zhí)行而導(dǎo)致數(shù)據(jù)的不一致。事務(wù)隔離分為不同級別,包括讀未提交( Read uncommitted )、讀提交( read committed )、可重復(fù)讀( repeatable read )和串行化( Serializable )

持久性:事務(wù)處理結(jié)束后,對數(shù)據(jù)的修改就是永久的,即便系統(tǒng)故障也不會丟失。

上面四個屬性,可以簡稱為 ACID 。

原子性(Atomicity,或稱不可分割性)

一致性(Consistency)

隔離性(Isolation,又稱獨立性)

持久性(Durability)。

2、事務(wù)的作用

當(dāng)程序員在編寫上層代碼邏輯訪問數(shù)據(jù)庫時,事務(wù)能夠簡化編程時需要考慮的多種細(xì)節(jié)問題,例如我們在使用事務(wù)時,要么提交要么回滾,不用去擔(dān)心網(wǎng)絡(luò)異常、服務(wù)器宕機(jī)等問題。

3、存儲引擎對事務(wù)的支持

在 MySQL 中只有Innodb支持事務(wù),而MyISAM不支持。

【mysql】事務(wù)的四種特性的理解,mysql修煉內(nèi)功基地,mysql,數(shù)據(jù)庫

4、事務(wù)的提交方式

自動提交

查看MySQL事務(wù)的提交方式發(fā)現(xiàn)是自動提交

```mysql
##查看MySQL事務(wù)的提交方式發(fā)現(xiàn)是自動提交
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.02 sec)

**使用set改變MySQL的事務(wù)提交方式**:

```sql
##將MySQL的事務(wù)提交方式修改為禁止自動提交
mysql> set autocommit=0;
Query OK, 0 rows affected (0.01 sec)
 
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | OFF   |
+---------------+-------+
1 row in set (0.00 sec)
 
##將MySQL的事務(wù)提交方式修改為開啟自動提交
mysql> set autocommit=1;
Query OK, 0 rows affected (0.00 sec)
 
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.00 sec)

二、事務(wù)的啟動、回滾與提交

1、準(zhǔn)備工作:調(diào)整MySQL的默認(rèn)隔離級別為最低/創(chuàng)建測試表

為了看到演示現(xiàn)象,先將MySQL的默認(rèn)隔離級別設(shè)置成讀未提交(最低)后退出重啟:

mysql> set global transaction isolation level read uncommitted;
Query OK, 0 rows affected (0.00 sec)
##修改默認(rèn)隔離級別生效
mysql> select @@tx_isolation;
+------------------+
| @@tx_isolation   |
+------------------+
| READ-UNCOMMITTED |
+------------------+
1 row in set, 1 warning (0.00 sec)

創(chuàng)建測試表:

create table if not exists account(
id int primary key,
name varchar(50) not null default '',
blance decimal(10,2) not null default 0.0
)ENGINE=InnoDB DEFAULT CHARSET=UTF8;

2、證明事務(wù)的開始與回滾

mysql> start transaction; -- 開始一個事務(wù)begin也可以,推薦begin
Query OK, 0 rows affected (0.00 sec)
mysql> savepoint save1; -- 創(chuàng)建一個保存點save1
Query OK, 0 rows affected (0.00 sec)
mysql> insert into account values (1, '張三', 1030.00); -- 插入一條記錄
Query OK, 1 row affected (0.05 sec)
mysql> savepoint save2; -- 創(chuàng)建一個保存點save2
Query OK, 0 rows affected (0.01 sec)
mysql> insert into account values (2, '李四', 13000.00); -- 在插入一條記錄
Query OK, 1 row affected (0.00 sec)
mysql> select * from account; -- 兩條記錄都在了
+----+--------+----------+
| id | name | blance |
+----+--------+----------+
| 1 | 張三 | 1030.00 |
| 2 | 李四 | 13000.00 |
+----+--------+----------+
2 rows in set (0.00 sec)
mysql> rollback to save2; -- 回滾到保存點save2
Query OK, 0 rows affected (0.03 sec)
mysql> select * from account; -- 一條記錄沒有了
+----+--------+--------+
| id | name | blance |
+----+--------+--------+
| 1 | 張三 | 100.00 |
+----+--------+--------+
1 row in set (0.00 sec)
mysql> rollback; -- 直接rollback,回滾在最開始
Query OK, 0 rows affected (0.00 sec)
mysql> select * from account; -- 所有剛剛的記錄沒有了
Empty set (0.00 sec)

3、證明未commit,客戶端崩潰,mysql自動回滾(隔離級別設(shè)置為未提交)

-- 終端A
mysql> select * from account; -- 當(dāng)前表內(nèi)無數(shù)據(jù)
Empty set (0.00 sec)
mysql> show variables like 'autocommit'; -- 依舊自動提交
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.00 sec)
mysql> begin; -- 開啟事務(wù)
Query OK, 0 rows affected (0.00 sec)
mysql> insert into account values (1, '張三', 100.30); -- 插入記錄
Query OK, 1 row affected (0.00 sec)
mysql> select * from account; -- 數(shù)據(jù)已經(jīng)存在,但沒有commit,此時同時查看
-- 終端B
+----+--------+--------+
| id | name | blance |
+----+--------+--------+
| 1 | 張三 | 100.30 |
+----+--------+--------+
1 row in set (0.00 sec)
mysql> Aborted -- ctrl + \ 異常終止MySQL
-- 終端B
mysql> select * from account; -- 終端A崩潰前
+----+--------+--------+
| id | name | blance |
+----+--------+--------+
| 1 | 張三 | 100.30 |
+----+--------+--------+
1 row in set (0.00 sec)
mysql> select * from account; -- 數(shù)據(jù)自動回滾
Empty set (0.00 sec)

結(jié)論

1、autocommit并不會影響begin后啟動的事務(wù)的提交,使用begin后必須輸入commit才能使數(shù)據(jù)持久化。

2、單句SQL本質(zhì)就是事務(wù),它的持久化和autocommit有關(guān),autocommit為ON,表示單SQL無需手動commit自動提交,否則需要手動commit令數(shù)據(jù)持久化。(select有特殊情況,因為MySQL 有 MVCC )

3、事務(wù)可以手動回滾,同時,當(dāng)操作異常,MySQL會自動回滾

4、我們能看到事務(wù)本身的原子性(rollback),持久性(commit)

三、事務(wù)的隔離級別

1、隔離性

1、MySQL服務(wù)可能會同時被多個客戶端進(jìn)程(線程)訪問,訪問的方式以事務(wù)方式進(jìn)行。

2、一個事務(wù)可能由多條SQL構(gòu)成,也就意味著,任何一個事務(wù),都有執(zhí)行前,執(zhí)行中,執(zhí)行后的階段。而所謂的原子性,其實就是讓用戶層,要么看到執(zhí)行前,要么看到執(zhí)行后。執(zhí)行中出現(xiàn)問題,可以隨時回滾。所以單個事務(wù),對用戶表現(xiàn)出來的特性,就是原子性。

3、但是所有事務(wù)都要有個執(zhí)行過程,那么在多個事務(wù)各自執(zhí)行多個SQL的時候,就還是有可能會出現(xiàn)互相影響的情況。比如:多個事務(wù)同時訪問同一張表,甚至同一行數(shù)據(jù)。

4、數(shù)據(jù)庫中,為了保證事務(wù)執(zhí)行過程中盡量不受干擾,就有了一個重要特征:隔離性 。

5、數(shù)據(jù)庫中,允許事務(wù)受不同程度的干擾,就有了一種重要特征:隔離級別

2、隔離級別

讀未提交【Read Uncommitted】: 在該隔離級別,所有的事務(wù)都可以看到其他事務(wù)沒有提交的執(zhí)行結(jié)果。(實際生產(chǎn)中不可能使用這種隔離級別的),但是相當(dāng)于沒有任何隔離性,也會有很多并發(fā)問題,如臟讀,幻讀,不可重復(fù)讀等,我們上面為了做實驗方便,用的就是這個隔離性。

讀提交【Read Committed】:該隔離級別是大多數(shù)數(shù)據(jù)庫的默認(rèn)的隔離級別(不是 MySQL 默認(rèn)的)。它滿足了隔離的簡單定義:一個事務(wù)只能看到其他的已經(jīng)提交的事務(wù)所做的改變。這種隔離級別會引起不可重復(fù)讀,即一個事務(wù)執(zhí)行時,如果多次 select,可能得到不同的結(jié)果。

可重復(fù)讀【Repeatable Read】: 這是 MySQL 默認(rèn)的隔離級別,它確保同一個事務(wù),在執(zhí)行中,多次讀取操作數(shù)據(jù)時,會看到同樣的數(shù)據(jù)行。但是有的數(shù)據(jù)庫會有幻讀問題。(MySQL不會)

串行化【Serializable】: 這是事務(wù)的最高隔離級別,它通過強(qiáng)制事務(wù)排序,使之不可能相互沖突,從而解決了幻讀的問題。它在每個讀的數(shù)據(jù)行上面加上共享鎖。但是可能會導(dǎo)致超時和鎖競爭(這種隔離級別太極端,實際生產(chǎn)基本不使用)

隔離級別如何實現(xiàn):隔離,基本都是通過鎖實現(xiàn)的,不同的隔離級別,鎖的使用是不同的。常見有,表鎖,行鎖,讀鎖,寫鎖,間隙鎖(GAP),Next-Key鎖(GAP+行鎖)等

3、隔離級別的查看與設(shè)置隔離性

3.1查看隔離性

-- 查看
mysql> SELECT @@global.tx_isolation; --查看全局隔級別
+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| REPEATABLE-READ |
+-----------------------+
1 row in set, 1 warning (0.00 sec)
mysql> SELECT @@session.tx_isolation; --查看會話(當(dāng)前)全局隔級別
+------------------------+
| @@session.tx_isolation |
+------------------------+
| REPEATABLE-READ |
+------------------------+
1 row in set, 1 warning (0.00 sec)
mysql> SELECT @@tx_isolation; --默認(rèn)同上
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set, 1 warning (0.00 sec)

3.2、設(shè)置隔離性

語法:

-- 設(shè)置當(dāng)前會話 or 全局隔離級別語法
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ
COMMITTED | REPEATABLE READ | SERIALIZABLE}

設(shè)置會話的隔離級別為串行化:

--設(shè)置當(dāng)前會話隔離性,另起一個會話,看不多,只影響當(dāng)前會話
mysql> set session transaction isolation level serializable; -- 串行化
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @@global.tx_isolation; --全局隔離性還是RR
+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| REPEATABLE-READ |
+-----------------------+
1 row in set, 1 warning (0.00 sec)
mysql> SELECT @@session.tx_isolation; --會話隔離性成為串行化
+------------------------+
| @@session.tx_isolation |
+------------------------+
| SERIALIZABLE |
+------------------------+
1 row in set, 1 warning (0.00 sec)
mysql> SELECT @@tx_isolation; --同上
+----------------+
| @@tx_isolation |
+----------------+
| SERIALIZABLE |
+----------------+
1 row in set, 1 warning (0.00 sec)

–設(shè)置全局隔離性,另起一個會話,會被影響

mysql> set global transaction isolation level READ UNCOMMITTED;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @@global.tx_isolation;
+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| READ-UNCOMMITTED |
+-----------------------+
1 row in set, 1 warning (0.00 sec)
mysql> SELECT @@session.tx_isolation;
+------------------------+
| @@session.tx_isolation |
+------------------------+
| READ-UNCOMMITTED |
+------------------------+
1 row in set, 1 warning (0.00 sec)
mysql> SELECT @@tx_isolation;
+------------------+
| @@tx_isolation |
+------------------+
| READ-UNCOMMITTED |
+------------------+
1 row in set, 1 warning (0.00 sec)
-- 注意,如果沒有現(xiàn)象,關(guān)閉mysql客戶端,重新連接。

當(dāng)一個會話修改了全局隔離級別,將會同時修改其他所有會話的全局隔離級別。

后續(xù)登錄時,會話和默認(rèn)的隔離級別將會引用全局隔離級別的設(shè)置。

盡量保證隔離級別一致,閑的沒事不要改事務(wù)的隔離級別。

4、四種隔離級別詳解

4.1、讀未提交【Read Uncommitted】

--先設(shè)置當(dāng)前的全局隔離級別為讀未提交,再退出MySQL重新登錄一下讓其生效
mysql> set global transaction isolation level read uncommitted;
Query OK, 0 rows affected (0.01 sec)

本文第二章就是用讀未提交來舉例的。

在多個并行的會話中啟動事務(wù),一個事務(wù)在改動數(shù)據(jù)庫哪怕沒有commit提交,其他事務(wù)也是能夠?qū)崟r的看到它修改的數(shù)據(jù)。一個事務(wù)在執(zhí)行中,讀到另一個執(zhí)行中事務(wù)的更新(或其他操作)但是未commit的數(shù)據(jù),這種不合理的現(xiàn)象叫做臟讀(dirty read)

讀未提交的其他不合理現(xiàn)象還有不可重復(fù)讀、幻讀

讀未提交幾乎沒有加鎖,雖然效率高,但是問題太多,嚴(yán)重不建議采用。

4.2、讀提交【Read Committed】

-- 終端A
mysql> set global transaction isolation level read committed;
Query OK, 0 rows affected (0.00 sec)
-- 重啟客戶端
mysql> select * from account; -- 查看當(dāng)前數(shù)據(jù)
+----+--------+----------+
| id | name | blance |
+----+--------+----------+
| 1 | 張三 | 123.00 |
| 2 | 李四 | 10000.00 |
+----+--------+----------+
2 rows in set (0.00 sec)
mysql> begin; -- 手動開啟事務(wù),同步的開始終端B事務(wù)
Query OK, 0 rows affected (0.00 sec)
mysql> update account set blance=321.0 where id=1; -- 更新張三數(shù)據(jù)
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
--切換終端到終端B,查看數(shù)據(jù)。
mysql> commit; --commit提交!
Query OK, 0 rows affected (0.01 sec)
-- 切換終端到終端B,再次查看數(shù)據(jù)。
-- 終端B
mysql> begin; -- 手動開啟事務(wù),和終端A一前一后
Query OK, 0 rows affected (0.00 sec)
mysql> select * from account; -- 終端A commit之前,查看不到
+----+--------+----------+
| id | name | blance |
+----+--------+----------+
| 1 | 張三 | 123.00 | -- 老的值
| 2 | 李四 | 10000.00 |
+----+--------+----------+
2 rows in set (0.00 sec)
-- 終端A commit之后,看到了!
-- but,此時還在當(dāng)前事務(wù)中,并未commit,那么就造成了,同一個事務(wù)內(nèi),同樣的讀取,在不同的時間段
##(依舊還在事務(wù)操作中!),讀取到了不同的值,這種現(xiàn)象叫做不可重復(fù)讀(non reapeatable read)?。?/span>
##(這個是問題嗎??)
mysql> select *from account;
+----+--------+----------+
| id | name | blance |
+----+--------+----------+
| 1 | 張三 | 321.00 | -- 新的值
| 2 | 李四 | 10000.00 |
+----+--------+----------+
2 rows in set (0.00 sec)

通過試驗可以發(fā)現(xiàn)讀提交級別,事務(wù)A在commit提交事務(wù)之前,所做的修改是不會被其他事務(wù)看到的,一旦事務(wù)A發(fā)起commit之后,其他事務(wù)就能看到事務(wù)A對數(shù)據(jù)的修改。這就造成了其他事務(wù)在不同的時間點select查看數(shù)據(jù)庫時,會查到不同的數(shù)據(jù)。這種現(xiàn)象叫不可重復(fù)讀。(事務(wù)中的讀取不是原子的)

4.3、可重復(fù)讀【Repeatable Read】

進(jìn)行插入操作

-- 終端A
mysql> set global transaction isolation level repeatable read; -- 設(shè)置全局隔離級別
RR
Query OK, 0 rows affected (0.01 sec)
-- 關(guān)閉終端重啟
mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ | -- 隔離級別RR
+-----------------+
1 row in set, 1 warning (0.00 sec)
-- 終端A
mysql> select *from account;
+----+--------+----------+
| id | name | blance |
+----+--------+----------+
| 1 | 張三 | 321.00 |
| 2 | 李四 | 10000.00 |
+----+--------+----------+
2 rows in set (0.00 sec)
mysql> begin; -- 開啟事務(wù),終端B同步開啟
Query OK, 0 rows affected (0.00 sec)
mysql> insert into account (id,name,blance) values(3, '王五', 5432.0);
Query OK, 1 row affected (0.00 sec)
-- 切換到終端B,查看另一個事務(wù)是否能看到
mysql> commit; -- 提交事務(wù)
Query OK, 0 rows affected (0.00 sec)
-- 切換終端到終端B,查看數(shù)據(jù)。
mysql> select * from account;
+----+--------+----------+
| id | name | blance |
+----+--------+----------+
| 1 | 張三 | 4321.00 |
| 2 | 李四 | 10000.00 |
| 3 | 王五 | 5432.00 |
+----+--------+----------+
3 rows in set (0.00 sec)
-- 終端B
mysql> begin; -- 開啟事務(wù)
Query OK, 0 rows affected (0.00 sec)
mysql> select * from account; -- 終端A commit前 查看
+----+--------+----------+
| id | name | blance |
+----+--------+----------+
| 1 | 張三 | 4321.00 |
| 2 | 李四 | 10000.00 |
+----+--------+----------+
2 rows in set (0.00 sec)
mysql> select * from account; -- 終端A commit后 查看
+----+--------+----------+
| id | name | blance |
+----+--------+----------+
| 1 | 張三 | 4321.00 |
| 2 | 李四 | 10000.00 |
+----+--------+----------+
2 rows in set (0.00 sec)
mysql> select * from account;
+----+--------+----------+
| id | name | blance |
+----+--------+----------+
| 1 | 張三 | 4321.00 |
| 2 | 李四 | 10000.00 |
+----+--------+----------+
2 rows in set (0.00 sec)
mysql> commit; -- 結(jié)束事務(wù)
Query OK, 0 rows affected (0.00 sec)
mysql> select * from account; -- 看到更新
+----+--------+----------+
| id | name | blance |
+----+--------+----------+
| 1 | 張三 | 4321.00 |
| 2 | 李四 | 10000.00 |
| 3 | 王五 | 5432.00 |
+----+--------+----------+
3 rows in set (0.00 sec)

多次查看,發(fā)現(xiàn)終端A在對應(yīng)事務(wù)中insert的數(shù)據(jù),在終端B的事務(wù)周期中,也沒有什么影響,也符合可重復(fù)的特點。但是,一般的數(shù)據(jù)庫在可重復(fù)讀情況的時候,無法屏蔽其他事務(wù)insert的數(shù)據(jù)(為什么?因為隔離性實現(xiàn)是對數(shù)據(jù)加鎖完成的,而insert待插入的數(shù)據(jù)因為并不存在,那么一般加鎖無法屏蔽這類問題),會造成雖然大部分內(nèi)容是可重復(fù)讀的,但是insert的數(shù)據(jù)在可重復(fù)讀情況被讀取出來,導(dǎo)致多次查找時,會多查找出來新的記錄,就如同產(chǎn)生了幻覺。這種現(xiàn)象,叫做幻讀(phantom read)。很明顯,MySQL在RR級別的時候,是解決了幻讀問題的(解決的方式是用Next-Key鎖(GAP+行鎖)解決的。這塊比較難,有興趣同學(xué)了解一下)。

4.4、串行化

-- 對所有操作全部加鎖,進(jìn)行串行化,不會有問題,但是只要串行化,效率很低,幾乎完全不會被采用
-- 終端A
mysql> set global transaction isolation level serializable;
Query OK, 0 rows affected (0.00 sec)
mysql> select @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| SERIALIZABLE |
+----------------+
1 row in set, 1 warning (0.00 sec)
mysql> begin; -- 開啟事務(wù),終端B同步開啟
Query OK, 0 rows affected (0.00 sec)
mysql> select * from account; -- 兩個讀取不會串行化,共享鎖
+----+--------+----------+
| id | name | blance |
+----+--------+----------+
| 1 | 張三 | 4321.00 |
| 2 | 李四 | 10000.00 |
| 3 | 王五 | 5432.00 |
+----+--------+----------+
3 rows in set (0.00 sec)
mysql> update account set blance=1.00 where id=1; -- 終端A中有更新或者其他操作,會阻
##塞。直到終端B事務(wù)提交。
Query OK, 1 row affected (18.19 sec)
Rows matched: 1 Changed: 1 Warnings: 0
-- 終端B
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from account; -- 兩個讀取不會串行化
+----+--------+----------+
| id | name | blance |
+----+--------+----------+
| 1 | 張三 | 4321.00 |
| 2 | 李四 | 10000.00 |
| 3 | 王五 | 5432.00 |
+----+--------+----------+
3 rows in set (0.00 sec)
mysql> commit; -- 提交之后,終端A中的update才會提交。
Query OK, 0 rows affected (0.00 sec)

【mysql】事務(wù)的四種特性的理解,mysql修煉內(nèi)功基地,mysql,數(shù)據(jù)庫

結(jié)論:

  • 其中隔離級別越嚴(yán)格,安全性越高,但數(shù)據(jù)庫的并發(fā)性能也就越低,往往需要在兩者之間找一個平

    衡點。

  • 不可重復(fù)讀的重點是修改和刪除:同樣的條件, 你讀取過的數(shù)據(jù),再次讀取出來發(fā)現(xiàn)值不一樣了

    幻讀的重點在于新增:同樣的條件, 第1次和第2次讀出來的記錄數(shù)不一樣

  • 說明: mysql 默認(rèn)的隔離級別是可重復(fù)讀,一般情況下不要修改

  • 上面的例子可以看出,事務(wù)也有長短事務(wù)這樣的概念。事務(wù)間互相影響,指的是事務(wù)在并行執(zhí)行的

    時候,即都沒有commit的時候,影響會比較大

【mysql】事務(wù)的四種特性的理解,mysql修煉內(nèi)功基地,mysql,數(shù)據(jù)庫文章來源地址http://www.zghlxwxcb.cn/news/detail-652174.html

到了這里,關(guān)于【mysql】事務(wù)的四種特性的理解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 事務(wù)的四個特性、四個隔離級別以及數(shù)據(jù)庫的常用鎖

    事務(wù)的四個特性、四個隔離級別以及數(shù)據(jù)庫的常用鎖 四大特性 事務(wù)的四大特性,通常被稱為ACID特性,是數(shù)據(jù)庫管理系統(tǒng)(DBMS)確保事務(wù)處理的關(guān)鍵屬性。這四大特性分別是: 原子性(Atomicity): 原子性要求事務(wù)是一個不可分割的單位,要么全部執(zhí)行,要么全部不執(zhí)行。如

    2024年02月04日
    瀏覽(34)
  • MySQL批量更新的四種方法

    MySQL批量更新的四種方法

    最近做一個需求,更新3w條數(shù)據(jù),一個一個update去更新的,結(jié)果花了80分鐘,這樣性能上很差,也容易阻塞,所以就找了一些MySQL批量更新的方式,在此記錄一下 這種更新會將其它字段更新為默認(rèn)值,因為它是先將重復(fù)記錄刪掉再更新,謹(jǐn)慎使用 1 2 replace into ` user ` (id,age) va

    2024年02月16日
    瀏覽(22)
  • mysql數(shù)據(jù)庫limit的四種用法

    mysql數(shù)據(jù)庫limit的四種用法

    mysql數(shù)據(jù)庫中l(wèi)imit子句可以被用于強(qiáng)制select語句返回指定的記錄數(shù)。limit接受一個或兩個數(shù)字參數(shù)。參數(shù)必須是一個整數(shù)常量。如果給定兩個參數(shù),第一個參數(shù)指定第一個返回記錄行的偏移量,第二個參數(shù)指定返回記錄行的最大數(shù)目;若果給定一個參數(shù),則表示回記錄行的最大

    2024年02月08日
    瀏覽(30)
  • MySQL在Linux上的四種安裝方式

    MySQL在Linux上的四種安裝方式

    目錄 前言 一、倉庫安裝 二、本地安裝 三、容器安裝 四、源碼安裝 博主的配置信息: Windows版本:Win10 VMware虛擬機(jī)版本:Vmware Workstation Pro 17 Linux版本:Red Hat Enterprise Linux 9.1 MySQL版本:MySQL Community Server 8.0.32 保證Linux的正常聯(lián)網(wǎng)以及配置yum倉庫。 可以在MySQL官網(wǎng)地址:https:

    2024年01月23日
    瀏覽(21)
  • IDEA連接MySQL數(shù)據(jù)庫的四種方法

    IDEA連接MySQL數(shù)據(jù)庫的四種方法

    首先右擊此電腦點擊管理,進(jìn)入頁面 ?再服務(wù)欄確保MySQL是正常運行狀態(tài) 打開IDEA, 左邊欄選擇Maven Archetype,新建一個名為javaweb的新工程 進(jìn)行如圖編輯完成新建 ?在Main包下新建一個java包,右擊java包進(jìn)行下圖操作,java包擁有新建class的權(quán)限 在java下面新建一個HelloConnection1的類,

    2024年02月12日
    瀏覽(28)
  • MySQL入門必備:Linux中部署MySQL環(huán)境的四種方式詳解

    MySQL入門必備:Linux中部署MySQL環(huán)境的四種方式詳解

    目錄 一、倉庫安裝 二、本地安裝 三、Docker中安裝 四、源碼安裝 首先需要下載mysql軟件包: 1、進(jìn)入MySQL官網(wǎng) 2、進(jìn)入MySQL社區(qū)版下載 3、使用yum方式下載MySQL 4、下載對應(yīng)版本的軟件包 5、這里可以不登錄直接下載軟件包 6、復(fù)制下載鏈接 7、然后進(jìn)入到linux命令行中使用命令下

    2024年02月07日
    瀏覽(22)
  • MySQL初級篇 | 修改MySQL密碼的四種方法(適合初學(xué)者)

    MySQL初級篇 | 修改MySQL密碼的四種方法(適合初學(xué)者)

    ?作者簡介:大家好我是@每天都要敲代碼,希望一起努力,一起進(jìn)步! ??個人主頁:@每天都要敲代碼的個人主頁 作為初學(xué)者,對于MySQL密碼的修改,目前我已知的有四種方法:前三種是在知道密碼的情況下修改,因為需要我們先登錄;最后一種適合忘記密碼的情況下進(jìn)行修

    2024年02月02日
    瀏覽(23)
  • MySQL修煉手冊11:事務(wù)處理:確保數(shù)據(jù)的一致性與完整性

    在探索數(shù)據(jù)管理的世界中,理解如何在數(shù)據(jù)庫中使用事務(wù)處理,無疑是一項關(guān)鍵的能力。在處理復(fù)雜的數(shù)據(jù)庫操作,尤其是在你試圖在多個表或數(shù)據(jù)庫中更新數(shù)據(jù)時,事務(wù)可以確保這些更改具有原子性、一致性、隔離性和持久性,即ACID。因此,掌握事務(wù)對任何數(shù)據(jù)庫專業(yè)人員

    2024年01月21日
    瀏覽(25)
  • 【mysql】給一張表添加外鍵的四種方法

    添加外鍵約束名字一定不能重復(fù) 如何添加外鍵 方法一:直接在屬性值后面添加 方法二: 方法三:添加約束 方法四:在表的定義外進(jìn)行添加 1.創(chuàng)建表的時候直接在表字段后,跟primary key。(一張表有且只能有一個主鍵,主鍵具有唯一性。) 2.在創(chuàng)建表的時候在所有字段

    2024年02月11日
    瀏覽(27)
  • MySQL的四種安裝方式(新手必看、詳解、保姆級教程)

    MySQL的四種安裝方式(新手必看、詳解、保姆級教程)

    MySQL是一個 關(guān)系型數(shù)據(jù)庫管理系統(tǒng) , 由瑞典MySQL AB?公司開發(fā),屬于?Oracle?旗下產(chǎn)品。MySQL 是最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)之一,在?WEB?應(yīng)用方面,MySQL是最好的?RDBMS?(Relational Database Management System,關(guān)系數(shù)據(jù)庫管理系統(tǒng)) 應(yīng)用軟件之一。 MySQL是一種關(guān)系型數(shù)據(jù)庫管理系統(tǒng)

    2024年02月20日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包