老生常談:事務是邏輯上的一組操作,要麼都執行,要麼都不執行
經典例項:轉賬給你,我減少100,你增加100,不能因為系統故障導致,我錢轉出了,而你沒收到
事務的四大特性
序列執行是不會事務執行很順暢,但當不同事務同時執行時可能出現各種情況,以student表為例
# 表定義
create table `student` (# 初始資料`id` int(11
) not null auto_increment,
`name` varchar(
32) default null,
`create_time` timestamp null default current_timestamp on update current_timestamp,
primary key (`
id`)
) engine=innodb default charset=utf8mb4;
mysql> select *from student;a. 髒讀乙個事務讀到另乙個事務未提交的事務+----+----------+---------------------+
| id | name | create_time |
+----+----------+---------------------+
| 1 | jarry | 2020-08-13
09:14:01 |
| 2 | hameimei | 2020-08-13
09:14:09 |
+----+----------+---------------------+
2 rows in set (0.00 sec)
session_2在session_1讀期間改了資料後,又回退了事務,導致session_1讀的資料根本不存在
髒讀只在讀未提交隔離級別才出現
b. 不可重複讀
乙個事務中,可以讀到另乙個事務已經提交的資料
不可重複讀在讀未提交、讀已提交隔離級別都可能出現
c. 幻讀
乙個事務查詢某個條件查出記錄,之後別的事務對資料進行插入,那麼第乙個事務再用同樣的條件查詢時得到的結果和一開始的到的結果不一致
不可重複讀在讀未提交、讀已提交、可重複讀隔離級別都可能出現
兩者區別?
對於前者, 只需要鎖住滿足條件的記錄
對於後者, 要鎖住滿足條件及其相近的記錄
不可重複讀重點在於update和delete,而幻讀的重點在於insert
mysql事務隔離級別有4個:讀未提交、讀已提交、可重複讀、可序列化
# 讀未提交
# 讀已提交
#可重複讀
session_2 讀 session_1 發生變更提交,並且自己也提交後才可以讀到session_1的變更
可以解決髒讀、不可重複度,但是不能解決幻讀問題
#可重複讀
mysql隔離級別 MySQL 事務隔離級別
mysql innodb所提供的事務滿足acid的要求,事務是通過事務日誌中的redo log和undo log來實現原子性 undo log 一致性 undo log 永續性 redo log 事務通過鎖機制實現隔離性。1 事務隔離級別與實現read uncommitted 讀未提交 read c...
MySQL事務隔離級別
sql標準定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低階別的隔離級一般支援更高的 併發處理,並擁有更低的系統開銷。read uncommitted 讀取未提交內容 在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,...
Mysql 事務隔離級別
mysql 5.5預設儲存引擎 表型別 使用的是innodb,它是支援acid特性的 acid,指資料庫的原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 乙個支援事務 transaction 的資料庫系統,必需要具有這四種特性,否...