Data Definition Language
)數據庫定義語言 建表, 建庫, 修改表結構Data Manipulation Language
)數據操縱語言 增刪改查, select, insert, update, deleteData Control Language
)數據庫控制語言 修改用戶權限, 重置密碼Transaction Control Language
)事務控制語言 建立事務, 回滾一組SQL語句組成的執行單元, 這一組SQL語句, 要麼所有執行, 要麼所有不執行.
複製代碼
舉例sql
事務:數據庫
一個不可分割的總體
回滾
舉例2:session
下一步
, 若是點擊取消
, 則所有回滾
.表類型
)表類型
):memory
)。事務處理
的數據庫(以確保事務處理不成功時數據的回退能力), 那就用innodb
。存儲引擎
(也稱做表類型
)。create table tb (id int) engine = myisam;
-- 或者
alter table tb engine = memory;
複製代碼
show engines;
複製代碼
ACID
)原子性 atomicity
併發
一致性 consistency
oop
能量守恆定律
事務
)先後, 郭靖, 黃蓉的銀行卡餘額之和是固定不變的.隔離性(isolation
)post
持久性(durability
)性能
事務一般包括多條SQL語句(DML), 其實單獨的DML語句, 也是一個事務測試
隱式事務(自動提交)ui
insert
,update
,delete
顯式事務atom
set autocommit = 0;
show variables like 'autocommit';
-- 或者
select @@autocommit;
複製代碼
-- 當前會話有效
set autocommit = 0;
-- 或者
set session autocommit = 0;
-- 或者
set @@autocommit = 0;
-- 或者
set @@session.autocommit = 0;
複製代碼
開啓事務
set autocommit = 0;
start transaction; // 可選
複製代碼
編寫事務中的sql語句(select
, insert
, update
, delete
) 不包括DDL(create
, drop
, alter
)
結束事務
commit
rollback
drop table if exists test_tb;
CREATE TABLE `test_tb` (
`id` int(5) unsigned NOT NULL,
`age` tinyint(5) unsigned NOT NULL,
`account` int(11) unsigned NOT NULL,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=innodb DEFAULT CHARSET=utf8;
INSERT INTO `test_tb`(`id`, `age`, `account`, `name`) VALUES (1, 11, 5000, '張三');
INSERT INTO `test_tb`(`id`, `age`, `account`, `name`) VALUES (2, 12, 5000, '李四');
複製代碼
set autocommit = 0;
start TRANSACTION;
update test_tb set account = account - 4000 where name = '張三';
update test_tb set account = account + 4000 where name = '李四';
commit;
複製代碼
set autocommit = 0;
start TRANSACTION;
update test_tb set account = account - 4000 where name = '張三';
update test_tb set account = account + 4000 where name = '李四';
rollback;
複製代碼
對於同時運行的多個事務, 若是沒有采用必要的隔離機制, 就會致使各類併發問題
更新可是尚未被提交
的字段以後插入/刪除
了一些新的行以後, 若是T1再次讀取同一個表, 就會多出/少了幾行.幻覺
...更新
了該字段並提交, T1再次讀取同一個字段, 值就不一樣了.一次只作一件事, 沒有其餘事情的干擾, 確定不容易出錯, 可是效率也會比較低
read uncommitted
)
髒讀
, 不可重複讀
和幻讀
, 都會出現read commited
)
不可重複讀
和幻讀
問題仍然可能出現repeatable read
)
髒讀
和不可重複讀
, 可是幻讀
問題讓然存在serializable
)
全部併發問題均可以免
MySQL支持以上所有四種事務隔離級別, 默認 repeatable read
(可重複讀)
select @@tx_isolation;
-- 或者
show variables like "tx_isolation";
複製代碼
set session transaction isolation level repeatable read; // 當前會話
-- 或者
set global transaction isolation level repeatable read; // 全局
複製代碼
感興趣的小夥伴們, 能夠測試一下各個隔離級別的不一樣 下面是測試須要時, 用到的數據
DROP TABLE IF EXISTS test;
CREATE TABLE test (
id INT auto_increment PRIMARY KEY,
NAME VARCHAR ( 10 ) NOT NULL,
account INT ( 11 ) NOT NULL,
age TINYINT ( 1 ) NOT NULL,
sex CHAR ( 1 ) NOT NULL DEFAULT '男'
);
INSERT INTO test ( NAME, account, age )
VALUES
( '張三', 3000, 18 ),
( '李四', 4000, 28 ),
( '王五', 5000, 38 ),
( '趙六', 6000, 48 ),
( '孫七', 2000, 19 ),
( '周八', 1000, 29 ),
( '吳老九', 9000, 39 ),
( '馮老十', 8000, 49 );
複製代碼
髒讀、不可重複讀、幻讀的級別高低是:
髒讀 < 不可重複讀 < 幻讀
。
因此,設置了最高級別的serializable
就不用在設置repeatable read
和read committed
了
savepoint
)就像玩遊戲時的
存盤點
, 若是遊戲人物死了, 就會在存盤點復活
直接上例子, 以上面的數據爲例
set autocommit = 0;
start TRANSACTION;
update test set account = 9999 where id = 1;
SAVEPOINT a;
update test set account = 9999 where id = 2;
rollback to a;
select * from test;
複製代碼