# 事務(wù)
用途
? a -> b 轉(zhuǎn)賬
? 1. a的賬戶的錢 先扣去掉一部分? update person set money = money - 10 where name = a;
? 2. b的賬戶的錢 增加a扣除的部分? update person set money = money + 10 where name = b;
上面兩個條sql語句 要求全成功静檬, 要么都失敗熄捍, 這個時候我們就可以把這兩個sql語句放到同一事務(wù)中
支持情況: 只有Innodb 引擎的才支持, 常見的引擎有兩個(Innodb, MyISAM)
事務(wù)的特征(ACID):
原子性,每個事務(wù)是一個最小的不可分割單元
一致性旭旭,數(shù)據(jù)執(zhí)行執(zhí)行完事務(wù)之后,數(shù)據(jù)要保持一致(正確)
隔離性塞耕,事務(wù)和事務(wù)之間是隔離的闲擦,相互不影響(4中隔離級別)
持久性冯勉,一旦事務(wù)提交成功萌壳,數(shù)據(jù)發(fā)生了不可逆的變化
事務(wù)執(zhí)行的語句:
select 不需要事務(wù)的
插入亦镶,更新,刪除 默認情況下一條sql就是一個事務(wù)袱瓮,事務(wù)默認是開啟自動提交的
# sql語句的執(zhí)行 (SET AUTOCOMMIT=0), 把自動提交給取消
開始事務(wù) begin
執(zhí)行sql (如果中間錯誤了缤骨,執(zhí)行rollback)
提交事務(wù) commit
# 存檔(savepoint)
# mysql的隔離級別
#查看mysql 默認的隔離級別
@@global.transaction_isolation 系統(tǒng)的隔離級別
@@transaction_isolation 當前會話的隔離級別
select @@global.transaction_isolation,@@transaction_isolation;
# 隔離級別
? read uncommitted (讀未提交)? --> 導(dǎo)致臟讀,讀取到其他事務(wù)沒有提交的數(shù)據(jù),如果其他萬一回滾尺借,這是數(shù)據(jù)無效绊起。
?
? REPEATABLE-READ(默認的隔離級別,讀已提交) ->
? 解決臟讀燎斩,導(dǎo)致不可重復(fù)讀取虱歪,在同一事務(wù)中前后兩次查詢的數(shù)量可能不一致。
? repeatable-read (可重復(fù)讀) ->
? 解決不可重復(fù)讀栅表,導(dǎo)致幻讀
? 1. 在A中開啟事務(wù)? ? 2. 在B中開啟事務(wù)
? 3. 查詢一下叫'李四'學(xué)生? 4. 插入‘李四’的學(xué)生
? ? ? ? 5. 提交事務(wù)
? 6. 查詢‘李四’,李四不存在
? 7 插入一下李四笋鄙,有插入不成功(name要唯一)
? serializable(串行化)
? 解決幻讀
? 1. 一個事務(wù)一個的執(zhí)行,事務(wù)都不并發(fā)谨读,沒有任何問題,但是會到性能下降
?
? # 隔離界別越高坛吁,性能越下降(采用默認的隔離級別就可以了)
# 修改隔離級別
? set session transaction isolation level read uncommitted
? set session transaction isolation level read committed
? set session transaction isolation level? repeatable read
# 視圖
View
應(yīng)用場景
? 1. 數(shù)據(jù)關(guān)聯(lián)很復(fù)雜
? 2. 有一些數(shù)據(jù)不能想某些人看 (讓別人通過視圖查詢數(shù)據(jù))
什么是視圖
? 一張?zhí)摂M表劳殖,有字段等,但是不真正的存儲數(shù)據(jù)拨脉,對查詢結(jié)果的一個引用哆姻,在使用視圖的時候,我們以查詢?yōu)橹髅蛋颍静簧喜蛔龈旅В砑樱瑒h除操作帖旨。
1. 查詢 張三的人箕昭,他的各門課程成績, 按照降序進行排序
select st.s_name sname, cu.c_name cname, sc.s_score score from student st left join score sc on st.s_id = sc.s_id left join course cu on cu.c_id = sc.c_id where st.s_name = '錢電' order by score desc;
# 可以使用視圖
1. create view temp as select st.s_id sid,st.s_name sname, cu.c_name cname, sc.s_score score from student st left join score sc on st.s_id = sc.s_id left join course cu on cu.c_id = sc.c_id
2. select * from temp where sname = '趙雷' order by score desc;
# 注意: 如果希望更新視圖解阅,視圖和數(shù)據(jù)表的關(guān)系一一對應(yīng)的落竹,如果希望做更新和插入,直接在原表上進行
# 視圖不屬于這一次會話货抄, 一次創(chuàng)建之后可以一直使用
# 視圖是對真實數(shù)據(jù)表的引用述召,當真實數(shù)據(jù)表發(fā)生變化的時候朱转,視圖的數(shù)據(jù)也跟著發(fā)生變化。