MySQL事務,隔離級別

1.什麼是事務

use day0301;
獲取當前事件
select now();
獲取當前年
select year(now());
獲取當前年月日
select CURRENT_DATE();#注意不要加空格
select substring(‘我愛學習你呢’,1,3);
事務:一般用於數據的增刪改,查詢對事物沒有影響
MySQL事務
應用場景
現實實例:轉帳中如果遇到宕機一方帳已扣除,另一方沒有收到轉賬

所以用MySQL事務:轉賬成功,實現commit提交,發生錯誤執行rollback回滾
開啓事務:start transaction 開啓事務
回滾事務:rollback 回滾
提交事務:commit 提交

use day0301;
創建賬號表
create table account(
id int primary key auto_increment,
name varchar(20),
money double
);
#初始化數據
insert into account values (null,‘a’,1000);
insert into account values (null,‘b’,1000);
#提交事務
start transaction;
update account set money =money-100 where id=1;
update account set money =money+100 where id=2;
commit;
#回滾事務
start transaction;
update account set money =money-100 where id=1;
update account set money =money+100 where id=2;
rollback;

小結
開啓事務:start transaction;
提交事務:commit
回滾事務:rollback;

查看事務的提交方式
show variables like “%commit%”;
查詢結果爲自動提交
上述操作爲手動提交

設置回滾點
start transaction ;

update account set money =money-100 where id=1;
savepoint qq;
update account set money =money+100 where id=2;
rollback to qq;

小結:
開啓事務:start transaction
提交事務:commit
回滾事務:rollback
設置回滾點:save point 回滾點名#回滾到回滾點:rollback to 回滾點名;

2.四大事務

2.1原子性:

事務最小化不可再分割,一組事務要麼都成功,要麼都失敗

2.2持久性:

事務一但被提交,永久被保存,不可被改變

2.3隔離性:

每個事務之間相互獨立,沒有關係

2.4一致性:

操作事務前後,數據保持一致性,比如說訂單總額前後要一直

3.事務引起的三個問題:

3.1髒讀

一個事務讀取到另外一個事務的未提交的數據
在實際開發中,髒讀一定要避免,讀未提交

3.2不可重複讀

要求不嚴格的情況下可以存在
兩次讀取的數據不一樣,讀已提交,主要是數據的更新,,update操作

3.3幻讀

#讀已提交。一個事務讀取到另一個事務的已經提交的數據
#讀取另一個事務,插入,insert刪除delete的數據,對標記錄的操作

4.事務的隔離級別:

4.1讀未提交,

read uncomitted,存在髒讀,不可重複讀,幻讀問題。SQL sever,Oracle使用

4.2讀已提交

read committed 不存在髒讀,存在不可重複讀,幻讀問題

4.3可重複讀:

repeatable read 解決髒讀,不可重複讀問題,存在幻讀問題MySQL使用

4.4串行化:

serializable,所有問題都不存在,但是越安全效率越低

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章