mysql事务用法介绍及储存引擎介绍(MyLSAM,Innodb)
文章目錄
- 前言
- 事務(wù)
- 什么是事務(wù)
- 事務(wù)的3大范式
- 事務(wù)的三大特點(diǎn)
- 原子性(Atomicity)
- 一致性(Consistency)
- 隔離性(Isolation)
- 持久性(Durability)
- 控制事務(wù)的命令
- 事務(wù)的控制方法
- 如何存檔
- 使用事務(wù)命令(回滾)
- 使用set設(shè)置控制事務(wù)
- SAVEPOINT 語法
- 存儲引擎
- 什么是存儲引擎
- MyISAM介紹
- MyISAM有什么特點(diǎn)
- 什么生產(chǎn)場景適合使用MyISAM
- InnoDB介紹
- InnoDB有什么特點(diǎn)
- 什么生產(chǎn)場景適合使用InnoDB
- 企業(yè)生產(chǎn)環(huán)境中依據(jù)什么選擇存儲引擎
- 如何修改存儲引擎
前言
事務(wù)
什么是事務(wù)
- 事務(wù)是一種機(jī)制、一個(gè)操作序列,包含了一組數(shù)據(jù)庫操作命令,并且把所有的命令作為一個(gè)整體一起向系統(tǒng)提交或撤銷操作請求,即這一組數(shù)據(jù)庫命令要么都執(zhí)行,要么都不執(zhí)行(銀行轉(zhuǎn)賬;提交轉(zhuǎn)賬-確認(rèn)轉(zhuǎn)賬-回饋信息)
- 事務(wù)是一個(gè)不可分割的工作邏輯單元,在數(shù)據(jù)庫系統(tǒng)上執(zhí)行并發(fā)操作時(shí),事務(wù)是最小的控制單元(銀行減錢增前是不可以分割的總和不變)
- 適用于多用戶同時(shí)操作的數(shù)據(jù)庫系統(tǒng)的場景,如銀行、保險(xiǎn)公司及證券交易系統(tǒng)等等
- 通過事務(wù)的整體性以保證數(shù)據(jù)的一致性
- 如果事務(wù)成功了一部分,一部分未成功,則執(zhí)行回滾,回到事務(wù)的起點(diǎn),重新開始操作
事務(wù)的3大范式
確保每列保持原子性
確保表中的每列都和主鍵相關(guān)
確保每列都和主鍵直接相關(guān),而不是間接相關(guān)
事務(wù)的三大特點(diǎn)
原子性(Atomicity)
-
事務(wù)是一個(gè)完整的操作,事務(wù)的各元素是不可分的(原子的)
-
事務(wù)中的所有元素必須作為一個(gè)整體提交或回滾
-
如果事務(wù)中的任何元素失敗,則整個(gè)事務(wù)將失敗
銀行轉(zhuǎn)出和轉(zhuǎn)進(jìn)是一起的不會(huì)單獨(dú)
一致性(Consistency)
-
當(dāng)事務(wù)完成時(shí),數(shù)據(jù)必須處于一致狀態(tài)!
-
在事務(wù)開始之前,數(shù)據(jù)庫中存儲的數(shù)據(jù)處于一致狀態(tài);
-
在正在進(jìn)行的事務(wù)中,數(shù)據(jù)可能處于不一致的狀態(tài);
-
當(dāng)事y務(wù)成功完成時(shí),數(shù)據(jù)必須再次回到已知的一致狀態(tài)
銀行轉(zhuǎn)賬轉(zhuǎn)賬前是一致,的轉(zhuǎn)賬中不一致,轉(zhuǎn)賬后一致
隔離性(Isolation)
- 對數(shù)據(jù)進(jìn)行修改的所有并發(fā)事務(wù)是彼此隔離的,這表明事務(wù)必須是獨(dú)立的,它不應(yīng)以任何方式依賴于或影響其他事務(wù)
- 修改數(shù)據(jù)的事務(wù)可以在另一個(gè)使用相同數(shù)據(jù)的事務(wù)開始之前訪問這些數(shù)據(jù),或者在另一個(gè)使用相同數(shù)據(jù)的事務(wù)結(jié)束之后訪問這些數(shù)據(jù)
舉例子:
a轉(zhuǎn)賬給b, b轉(zhuǎn)賬給c, a不會(huì)轉(zhuǎn)給c這就是隔離
持久性(Durability)
- 事務(wù)持久性指不管系統(tǒng)是否發(fā)生故障,事務(wù)處理的結(jié)果都是永久的
- 一旦事務(wù)被提交,事務(wù)的效果會(huì)被永久地保留在數(shù)據(jù)庫中
控制事務(wù)的命令
事務(wù)控制語句
BEGIN或START TRANSACTION ===>表示事務(wù)的開始 COMMIT ===>提交 ROLLBACK ===>回滾 SAVEPOINT 存檔點(diǎn)名稱 ===>設(shè)置斷點(diǎn),存檔點(diǎn) RELEASE SAVEPOINT 存檔點(diǎn)名稱===>釋放存檔點(diǎn) ROLLBACK TO 存檔點(diǎn)名稱 ===>回滾到某個(gè)存檔點(diǎn) SET TRANSACTION ===>設(shè)置事務(wù)事務(wù)的控制方法
- 使用事務(wù)處理命令控制事務(wù)
- bein:開始一個(gè)事務(wù)
- commit:提交一個(gè)事務(wù)
- rollback:回滾一個(gè)事務(wù)(跳轉(zhuǎn)到bein狀態(tài))
- 使用set命令進(jìn)行控制
- set autocommit=0:禁止自動(dòng)提交
- set autocommit=1:開啟自動(dòng)提交
如何存檔
格式: savepoint <存檔點(diǎn)名稱>; 例如: savepoint s1;使用事務(wù)命令(回滾)
- bein:開始一個(gè)事務(wù)
- commit:提交一個(gè)事務(wù)
- rollback:回滾一個(gè)事務(wù)(跳轉(zhuǎn)到bein狀態(tài))
往數(shù)據(jù)表中插入一條數(shù)據(jù)一個(gè)在事務(wù)中提交,執(zhí)行操作語句必須使用commit,否則事務(wù)不可以自動(dòng)提交
mysql> begin; mysql> insert into info value('5','UI'); mysql> select * from info; +----+--------------+ | id | name | +----+--------------+ | 1 | 云計(jì)算 | | 2 | 大數(shù)據(jù) | | 3 | 人工智能 | | 4 | 區(qū)塊鏈 | | 5 | UI | +----+--------------+ mysql> rollback; mysql> select * from info; 再次查看記錄發(fā)現(xiàn)已經(jīng)沒有了 +----+--------------+ | id | name | +----+--------------+ | 1 | 云計(jì)算 | | 2 | 大數(shù)據(jù) | | 3 | 人工智能 | | 4 | 區(qū)塊鏈 | +----+--------------+使用set設(shè)置控制事務(wù)
- set autocommit=0:禁止自動(dòng)提交
- set autocommit=1:開啟自動(dòng)提交
SAVEPOINT 語法
SAVEPOINT 通過自定義的名稱設(shè)置一個(gè)存儲點(diǎn),如果當(dāng)前事務(wù)已經(jīng)有了一個(gè)同名的
savepoint 結(jié)點(diǎn)名;(回到上一檔下一檔的數(shù)據(jù)全部消失,rollback也意味著結(jié)束,必須是innodb引擎)
mysql> begin; mysql> insert into info (name,score,address) values ('wangwu',80,'bieji'); 插入記錄 mysql> select * from info; +----+----------+-------+---------+ | id | name | score | address | +----+----------+-------+---------+ | 1 | zhangsan | 80.00 | nj | | 2 | lisi | 80.00 | nj | | 4 | wangwu | 80.00 | bieji | +----+----------+-------+---------+ mysql> savepoint a; 保存點(diǎn)a mysql> insert into info (name,score,address) values ('tianshan',80,'bieji'); mysql> savepoint b; 保存點(diǎn)b mysql> insert into info (name,score,address) values ('heishang',80,'bieji'); mysql> rollback to b; 回到保存b mysql> select * from info; +----+----------+-------+---------+ | id | name | score | address | +----+----------+-------+---------+ | 1 | zhangsan | 80.00 | nj | | 2 | lisi | 80.00 | nj | | 4 | wangwu | 80.00 | bieji | | 5 | tianshan | 80.00 | bieji | | 6 | heishang | 80.00 | bieji | +----+----------+-------+---------+ mysql> rollback to a; 回到保存a mysql> select * from info; +----+----------+-------+---------+ | id | name | score | address | +----+----------+-------+---------+ | 1 | zhangsan | 80.00 | nj | | 2 | lisi | 80.00 | nj | | 4 | wangwu | 80.00 | bieji | +----+----------+-------+---------+結(jié)束事務(wù)3種方法
- commit;
- set autocommit=1;
- rollback;
存儲引擎
什么是存儲引擎
- MyISAM(不支持事務(wù))
- InnoDB(支持事務(wù))
MyISAM介紹
-
MyISAM存儲引擎是 MySQL關(guān)系數(shù)據(jù)庫系統(tǒng)5.5版本之前默認(rèn)的存儲引擎,前身是ISAM
-
ISAM是一個(gè)定義明確且歷經(jīng)時(shí)間考驗(yàn)的數(shù)據(jù)表格管理方法,在設(shè)計(jì)之時(shí)就考慮到數(shù)據(jù)庫被查詢的次數(shù)要遠(yuǎn)大于更新的次數(shù)
-
ISAM的特點(diǎn)
- 優(yōu)點(diǎn):ISAM執(zhí)行讀取操作的速度很快
- 缺點(diǎn):不支持事務(wù)處理
- 缺點(diǎn):不能夠容錯(cuò)
- 對事物沒有完整的要求
MyISAM有什么特點(diǎn)
- 不支持事務(wù)
- 表級鎖定形式,數(shù)據(jù)在更新時(shí)鎖定整個(gè)表
- 數(shù)據(jù)庫在讀寫過程中相互阻塞
- 會(huì)在數(shù)據(jù)寫入的過程阻塞用戶數(shù)據(jù)的讀取
- 也會(huì)在數(shù)據(jù)讀取的過程中阻塞用戶的數(shù)據(jù)寫入
- 每個(gè) MyISAM在磁盤上存儲成三個(gè)文件,每一個(gè)文件的名字以表的名字開始,擴(kuò)展名指出文件類型
- MyISAM在磁盤上存儲的文件
- .frm文件存儲表定義
- 數(shù)據(jù)文件的擴(kuò)展名為.MYD( MYData)
- 索引文件的擴(kuò)展名是.MYI( MYIndex)
什么生產(chǎn)場景適合使用MyISAM
- 公司業(yè)務(wù)不需要事務(wù)的支持
- 一般單方面讀取數(shù)據(jù)比較多的業(yè)務(wù),或單方面寫入數(shù)據(jù)比較多的業(yè)務(wù)
- MyISAM存儲引擎數(shù)據(jù)讀寫都比較頻繁場景不適合
- 使用讀寫并發(fā)訪問相對較低的業(yè)務(wù)
- 數(shù)據(jù)修改相對較少的業(yè)務(wù)
- 對數(shù)據(jù)業(yè)務(wù)一致性要求不是非常高的業(yè)務(wù)
- 服務(wù)器硬件資源相對比較差
InnoDB介紹
InnoDB有什么特點(diǎn)
- 支持事務(wù):支持4個(gè)事務(wù)隔離級別
- 行級鎖定,但是全表掃描仍然會(huì)是表級鎖定
- 讀寫阻塞與事務(wù)隔離級別相關(guān)
- 具有非常高效的緩存特性:能緩存索引,也能緩存數(shù)據(jù)
- 表與主鍵以簇的方式存儲
- 支持分區(qū)、表空間,類似 oracle數(shù)據(jù)庫
- 支持外鍵約束,5.5以前不支持全文索引,5.5版本以后支持全文索引
- 對硬件資源要求還是比較高的場合
什么生產(chǎn)場景適合使用InnoDB
- 業(yè)務(wù)需要事務(wù)的支持
- 行級鎖定對高并發(fā)有很好的適應(yīng)能力,但需確保查詢是通過索引來完成
- 業(yè)務(wù)數(shù)據(jù)更新較為頻繁的場景,如:論壇,微博等
- 業(yè)務(wù)數(shù)據(jù)一致性要求較高,例如:銀行業(yè)務(wù)
- 硬件設(shè)備內(nèi)存較大,利用 Innodb較好的緩存能力來提高內(nèi)存利用率,減少磁盤I/O的壓力
企業(yè)生產(chǎn)環(huán)境中依據(jù)什么選擇存儲引擎
-
需要考慮毎個(gè)存儲引擎提供了哪些不同的核心功能及應(yīng)用場景
-
支持的字段和數(shù)據(jù)類型
●所有引擎都支持通用的數(shù)據(jù)類型
●但不是所有的引擎都支持其它的字段類型,如二進(jìn)制對象 -
鎖定類型:不同的存儲引擎支持不同級別的鎖定
●表鎖定
●行鎖定 -
索引的支持
●建立索引在搜索和恢復(fù)數(shù)據(jù)庫中的數(shù)據(jù)的時(shí)候能夠顯著提高性能
●不同的存儲引擎提供不同的制作索引的技術(shù)
●有些存儲引擎根本不支持索引 -
事務(wù)處理的支持
●事務(wù)處理功能通過提供在向表中更新和插入信息期間的可靠性
●可根據(jù)企業(yè)業(yè)務(wù)是否要支持事務(wù)選擇存儲引擎
如何修改存儲引擎
共有四種方法
alter table 修改; 格式: alter table table_name engine=引擎; 例如: MySQL> alter table user_info engin=MyISAM;方法二:
修改my.cnf,指定默認(rèn)存儲引擎并重啟服務(wù) 格式: default-storage-engine=InnoDB 例如: vim my.cnf default-storage-engine=InnoDB方法三:
create table 創(chuàng)建表時(shí)指定存儲引擎 格式: create table 表名 (字段) engine=引擎 例如: MySQL> create table yibiao(id int)engine=MyISAM;方法四:(5.7之前的版本可以用)
Mysql_convert_table_format轉(zhuǎn)化存儲引擎 格式: Mysql_convert_table_format-user=root--password=密碼--sock=/tmp/mysql.sock-engine=引擎 庫名 表名 例如: [root@localhost ~]# yum install perl-DBI perl-DBD-MySQL -y [root@localhost ~]# /usr/local/mysql/bin/bysql_convert_table_format --user=root --passwork='123' --sock=/tmp/mysql.sock auth總結(jié)
以上是生活随笔為你收集整理的mysql事务用法介绍及储存引擎介绍(MyLSAM,Innodb)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DDR5内存接口:性能提升不止一点点
- 下一篇: 傲腾内存 vs SSD:速度之争,谁能称