MySQL的事務——事物隔離級別
目錄
概念
什么是事物?
模擬事物
事物操作
事物操作
事物特性
事物隔離級別
事務隔離操作
每文一語
概念
數據庫存儲引擎是數據庫底層軟件組織,數據庫管理系統(DBMS)使用數據引擎進行創建、查詢、更新和刪除數據。
不同的存儲引擎提供不同的存儲機制、索引技巧、鎖定水平等功能?,F在許多不同的數據庫管理系統都支持多種不同的數據引擎。Mysql的核心就是存儲引擎。
用戶可以根據不同的需求為數據表選擇不同的存儲引擎
可以使用 SHOW ENGINES 命令 可以查看Mysql的所有執行引擎我們 可以到 默認的執行引擎是innoDB 支持事務,行級鎖定和外鍵。
什么是事物?
在MySQL中的事務(Transaction)是由存儲引擎實現的,在MySQL中,只有InnoDB存儲引擎才支持事務。
事務處理可以用來維護數據庫的完整性,保證成批的 SQL 語句要么全部執行,要么全部不執行。
事務用來管理 DDL、DML、DCL 操作,比如 insert,update,delete 語句,默認是自動提交的。
模擬事物
在銀行轉賬時,必須保證轉賬絕對安全,這時需要事務參與:
update account set money = money - 200 where id = 1;
update account set money = money + 200 where id = 2;
假如在第一次update之后,出現了意外、異常,沒有執行第二次update,這時轉賬是否會出現異常?
事物操作
MySQL的事務操作主要有以下三種:
1、開啟事務:Start Transaction
任何一條DML語句(insert、update、delete)執行,標志事務的開啟
命令:BEGIN 或 START TRANSACTION
2、提交事務:Commit Transaction
成功的結束,將所有的DML語句操作歷史記錄和底層硬盤數據來一次同步
命令:COMMIT
3、回滾事務:Rollback Transaction
失敗的結束,將所有的DML語句操作歷史記錄全部清空
命令:ROLLBACK
之前的所有SQL操作其實也有事務,只是MySQL自動幫我們完成的,每執行一條SQL時MySQL就幫我們自動提交事務,因此如果想要手動控制事務,則必須關閉MySQL的事務自動提交。
在MySQL中直接用 SET 來改變 MySQL 的自動提交模式:
set autocommit=0?禁止自動提交
set autocommit=1?開啟自動提交
事物操作
create database if not exists mydb12_transcation;
use mydb12_transcation;
-- 創建賬戶表
create table account(
id int primary key, -- 賬戶id
name varchar(20), -- 賬戶名
money double -- 金額
);
-- 插入數據
insert into account values(1,'zhangsan',1000);
insert into account values(2,'lisi',1000);
-- 設置MySQL的事務為手動提交(關閉自動提交)
select @@autocommit;
set autocommit = 0;
-- 模擬賬戶轉賬
-- 開啟事務
begin;
update account set money = money - 200 where name = 'zhangsan';
update account set money = money + 200 where name = 'lisi';
-- 提交事務
commit;
-- 如果轉賬中的任何一條出現問題,則回滾事務
rollback;
事物特性
事物隔離級別
Isolate,顧名思義就是將事務與另一個事務隔離開,為什么要隔離呢?如果一個事務正在操作的數據被另一個事務修改或刪除了,最后的執行結果可能無法達到預期。如果沒有隔離性還會導致其他問題。
讀未提交(Read uncommitted)
一個事務可以讀取另一個未提交事務的數據,最低級別,任何情況都無法保證,會造成臟讀。
讀已提交(Read committed)
一個事務要等另一個事務提交后才能讀取數據,可避免臟讀的發生,會造成不可重復讀。
可重復讀(Repeatable read)
就是在開始讀取數據(事務開啟)時,不再允許修改操作,可避免臟讀、不可重復讀的發生,但是會造成幻讀。
串行(Serializable)
是最高的事務隔離級別,在該級別下,事務串行化順序執行,可以避免臟讀、不可重復讀與幻讀。但是這種事務隔離級別效率低下,比較耗數據庫性能,一般不使用。
事務隔離操作
-- 查看隔離級別
show variables like '%isolation%’;
-- 設置隔離級別
/*
set session transaction isolation level 級別字符串
級別字符串:read uncommitted、read committed、repeatable read、serializable
*/
-- 設置read uncommitted
set session transaction isolation level read uncommitted;
-- 設置read committed
set session transaction isolation level read committed;
-- 設置repeatable read
set session transaction isolation level repeatable read;
-- 設置serializable
set session transaction isolation level serializable;
每文一語
準確的定位自己才是最好的方法
MySQL 數據庫
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。