MySQL基礎入門教程之事務
引言
事務是一組操作的集合,它是一個不可分割的工作單位,事務會把所有的操作作為一個整體一起向系統提交或撤銷操作請求,即這些操作要么同時成功,要么同時失敗。
就比如: 張三給李四轉賬1000塊錢,張三銀行賬戶的錢減少1000,而李四銀行賬戶的錢要增加1000。
這一組操作就必須在一個事務的范圍內,要么都成功,要么都失敗。

正常情況: 轉賬這個操作, 需要分為以下這么三步來完成 , 三步完成之后, 張三減少1000, 而李四 增加1000, 轉賬成功 :

異常情況: 轉賬這個操作, 也是分為以下這么三步來完成 , 在執(zhí)行第三步是報錯了, 這樣就導致張三減少1000塊錢, 而李四的金額沒變, 這樣就造成了數據的不一致, 就出現問題了。

為了解決上述的問題,就需要通過數據的事務來完成,我們只需要在業(yè)務邏輯執(zhí)行之前開啟事務,執(zhí)行完畢后提交事務。如果執(zhí)行過程中報錯,則回滾事務,把數據恢復到事務開始之前的狀態(tài)。

注意: 默認MySQL的事務是自動提交的,也就是說,當執(zhí)行完一條DML語句時,MySQL會立即隱式的提交事務
1、事務操作
數據庫腳本:
drop table if exists account;
create table account
(
id int primary key AUTO_INCREMENT comment 'ID',
name varchar(10) comment '姓名',
money double(10, 2) comment '余額'
) comment '賬戶表';
insert into account(name, money)
VALUES ('張三', 2000),
('李四', 2000);1.1 未控制事務
1、測試正常情況
-- 1. 查詢張三余額 select * from account where name = '張三'; -- 2. 張三的余額減少1000 update account set money = money - 1000 where name = '張三'; -- 3. 李四的余額增加1000 update account set money = money + 1000 where name = '李四';
測試完畢之后檢查數據的狀態(tài), 可以看到數據操作前后是一致的

2、 測試異常情況
-- 1. 查詢張三余額 select * from account where name = '張三'; -- 2. 張三的余額減少1000 update account set money = money - 1000 where name = '張三'; 出錯了.... -- 3. 李四的余額增加1000 update account set money = money + 1000 where name = '李四'
我們把數據都恢復到2000, 然后再次一次性執(zhí)行上述的SQL語句(出錯了.... 這句話不符合SQL語法,執(zhí)行就會報錯),檢查最終的數據情況, 發(fā)現數據在操作前后不一致了

1.2 控制事務一
1、查看/設置事務提交方式
SELECT @@autocommit ; SET @@autocommit = 0 ;
2、 提交事務
COMMIT;
3、回滾事務
ROLLBACK;
注意:
上述的這種方式,我們是修改了事務的自動提交行為, 把默認的自動提交修改為了手動提交, 此時我們執(zhí)行的DML語句都不會提交, 需要手動的執(zhí)行commit進行提交。
1.3 控制事務二
1、開啟事務
START TRANSACTION 或 BEGIN ;
2、提交事務
COMMIT;
3、回滾事務
ROLLBACK;
轉賬案例:
-- 開啟事務 start transaction -- 1. 查詢張三余額 select * from account where name = '張三'; -- 2. 張三的余額減少1000 update account set money = money - 1000 where name = '張三'; -- 3. 李四的余額增加1000 update account set money = money + 1000 where name = '李四'; -- 如果正常執(zhí)行完畢, 則提交事務 commit; -- 如果執(zhí)行過程中報錯, 則回滾事務 -- rollback;
2、事務的四大特性
原子性(Atomicity):事務是不可分割的最小操作單元,要么全部成功,要么全部失敗。
一致性(Consistency):事務完成時,必須使所有的數據都保持一致狀態(tài)。
隔離性(Isolation):數據庫系統提供的隔離機制,保證事務在不受外部并發(fā)操作影響的獨立環(huán)境下運行。
持久性(Durability):事務一旦提交或回滾,它對數據庫中的數據的改變就是永久的。
上述就是事務的四大特性,簡稱ACID。
3、并發(fā)事務問題
1、贓讀:一個事務讀到另外一個事務還沒有提交的數據。

2、不可重復讀:一個事務先后讀取同一條記錄,但兩次讀取的數據不同,稱之為不可重復讀。

3、幻讀:一個事務按照條件查詢數據時,沒有對應的數據行,但是在插入數據時,又發(fā)現這行數據已經存在,好像出現了 "幻影“。

4、事務隔離級別
為了解決并發(fā)事務所引發(fā)的問題,在數據庫中引入了事務隔離級別。主要有以下幾種:

1、查看事務隔離級別
SELECT @@TRANSACTION_ISOLATION; 1
2、設置事務隔離級別
SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL
{ READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }注意:事務隔離級別越高,數據越安全,但是性能越低
總結
到此這篇關于MySQL基礎入門教程之事務的文章就介紹到這了,更多相關MySQL基礎事務內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
阿里云 Centos7.3安裝mysql5.7.18 rpm安裝教程
這篇文章主要介紹了阿里云 Centos7.3安裝mysql5.7.18 rpm安裝教程,需要的朋友可以參考下2017-06-06

