文章目錄
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,所有問題都不存在,但是越安全效率越低