您的位置:首页 > 数据库 > MySQL

mysql锁--事务及隔离级别--存储引擎

2014-07-04 22:30 656 查看
MySQL锁

执行操作时施加的锁模式
读锁:共享锁
写锁:独占锁,排它锁

锁粒度:
表锁:table lock
锁定了整张表
行锁:row lock
锁定了需要的行

粒度越小,开销越大,但并发性越好;
粒度越大,开销越小,但并发性越差;

锁的实现位置:
MySQL锁:可以使用显式锁
存储引擎锁:自动进行的(隐式锁);

显式锁(表级锁):
LOCK TABLES
UNLOCK TABLES

LOCK TABLES
tbl_name lock_type
[, tbl_name lock_type] ...

锁类型:READ|WRITE
mysql>lock tables classes READ;
如果这个时候向classes插入数据的话 会停在那里不动,直到解锁
mysql>unlock tables;
mysql>lock tables classes write;
这个时候插入与查询都会等待,直到解锁;
mysql>unlock tables;

InnoDB存储引擎也支持另外一种显式锁(锁定挑选出的部分行,行级锁 ):
SELECT ... LOCK IN SHARE MODE;
SELECT ... FOR UPDATE;

mysql>select * from classes where ClassID <=3 lock in share mode;
mysql>show table status like 'classes'; --查看引擎是哪种
mysql>show tables status\G --
mysql>alter table classes engine 'InnoDB'; --测试下,生产不手动锁,用系统默认锁就可。
mysql>show table status like 'classes'\G
mysql>select * from classes where ClassID <=3 lock in share mode;




事务及隔离级别

事务:Transaction --innodb的表结构和NDB,BDB的表结构可以支持事务
事务就是一组原子性的查询语句,也即将多个查询当作一个独立的工作单元。

ACID测试:能满足ACID测试就表示其支持事务,或兼容事务。
A:Atomicity,原子性
C:Consistency, 一致性
I: Isolation, 隔离性, 一个事务的所有修改操作在提交之前对其它事务是不可见的
Tom: 7000-3000
Jerry: 5000+3000

D:Durability, 持久性, 一旦事务得到提交,其所做的修改会永久有效

隔离级别:
1>READ UNCOMMITTED (读未提交)--- 能够看到别人尚未提交的数据;数据安全性不好,用得很少;
脏读,不可重读,幻读 ---XX对表做了操作还未提交,YY就可以看到效果,如XX删除表CLASSES某一行,还未提交,YY查询就看不到那一行了,XX执行回滚后,YY又会看到回滚后的结果;

2>READ COMMITTED (读提交) --- 一般数据库是这个,不过mysql是第三种;对事务要求不严格的话建议用这个;
不可重读,幻读
---启动显示事务,XX对表进行修(未提交),YY查看这个表时显示XX未操作的内容,当XX操作提交后,YY查询的内容仍然是XX未提交前内容,只有当YY执行提交后才会看到XX修改提交后的内容。

3>REPEATABLE READ (可重读)
幻读 ---显示事务启动后,XX对表classes做相修改,YY查询表时,是原表,当XX提交后,YY在查询这个表时还是原表(可重读);只有当YY当前事务提交后,才会看到XX做的修改;

4>SERIALIZABLE (可串行化)

强制事务的串行执行避免了幻读; --显示事务启动后,XX事务对表CLASS做了修改未提交前,YY事务对表查询时会产生阻塞(等待),等XX,提交或回滚后才可执行;

跟事务相关的常用命令

mysql>help contents
mysql>help Transactions
mysql> START TRANSACTION
mysql> COMMIT --提交
mysql> ROLLBACK
mysql>help rollback --回滚
mysql> SAVEPOINT identifier --保存点
mysql>help savepoint

mysql> ROLLBACK [WORK] TO [SAVEPOINT] identifier

演示
mysql>start transaction
mysql>select database();
mysql>select * from classes;
mysql>delete from classes where ClassID=10;
mysql>select * from classes;
mysql>ROLLBACK
mysql>select * from classes; ---未提交前,所有操作都可回滚到未操作前
mysql>delete from classes where ClassID=10;
mysql>commit; --提交后,就不能回滚了

mysql>start transaction;
mysql>delete from classes where ClassID=4;
mysql>savepoint a;
mysql>delete from calsses where ClassID=9;
mysql>savepoint b;
mysql>select * from classes;
mysql>rollback to b;
mysql>select * from classes; --回滚b以后所有操作

如果没有显式启动事务,每个语句都会当作一个独立的事务,其执行完成后会被自动提交;
mysql>show global variables like '%commit%';
可以看到 autocommit on 即 每个语句都自动提交,每次都会产生一个IO
mysql> SELECT @@global.autocommit; 跟上面命令一样 查询autocommit 状态
mysql> SET GLOBAL autocommit = 0;

关闭自动提交,请记得手动启动事务,手动进行提交;

查看MySQL的事务隔离级别
mysql> SHOW GLOBAL VARIABLES LIKE 'tx_isolation';
mysql> SELECT @@global.tx_isolation;

修改:
mysql>set global tx_isolation='READ-UNCOMMITTED';
重新建立连接看一下效果
mysql>use hellodb;
mysql>start transaction;
mysql>select * from classes;
开连接 都开启各自事务 可以做一些操作查看一下各级别的效果;
mysql>start transaction; 两个会话都执行

建议:对事务要求不特别严格的场景下,可以使用读提交;性能比默认要好;

MVCC:多版本并发控制
每个事务启动时,InnoDB为会每个启动的事务提供一个当下时刻的快照;
为了实现此功能,InnoDB会为每个表提供两隐藏的字段,一个用于保存行的创建时间,一个用于保存行的失效时间;
里面存储的是系统版本号;(system version number)

只在两个隔离级别下有效:READ COMMITTED和REPEATABLE READ

MySQL存储引擎
存储引擎也通常称作“表类型”

mysql> SHOW ENGINES;
mysql>show variable like '%engine%';
mysql>select version(); --查看数据库版本
mysql>desc t1; --查看表结构
mysql>show create table t1; --查看创建表t1时的sql语句
mysql> SHOW TABLES STATUS [LIKE clause] [WHERE clause]

SHOW TABLE STATUS [{FROM | IN} db_name]
[LIKE 'pattern' | WHERE expr]

mysql>show table status;
mysql> SHOW TABLE STATUS IN hellodb WHERE Name='classes'\G
mysql> show table status in hellodb like 'classes';
mysql>show engine innodb status; ---查看innodb表的运行状态

*************************** 1. row ***************************
Name: classes
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 8
Avg_row_length: 2048
Data_length: 16384
Max_data_length: 0
Index_length: 0
Data_free: 9437184
Auto_increment: 9
Create_time: 2014-04-08 11:14:52
Update_time: NULL
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.01 sec)

Name: 表名
Engine: 存储引擎
Version: 版本
Row_format: 行格式
{DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}
Rows: 表中的行数
Avg_row_length: 平均每行所包含的字节数;
Data_length: 表中数据总体大小,单位是字节
Max_data_length: 表能够占用的最大空间,单位为字节
Index_length: 索引的大小,单位为字节
Data_free: 对于MyISAM表,表示已经分配但尚未使用的空间,其中包含此前删除行之后腾出来的空间
Auto_increment: 下一个AUTO_INCREMENT的值;
Create_time: 表的创建时间;
Update_time:表数据的最近一次的修改时间;
Check_time:使用CHECK TABLE或myisamchk最近一次检测表的时间;
Collation: 排序规则
Checksum: 如果启用,则为表的checksum;
Create_options: 创建表时指定使用的其它选项;
Comment: 表的注释信息

InnoDB:
两种格式
1、innodb_file_per_table=OFF,即使用共享表空间
每张表一个独有的格式定义文件: tb_name.frm
还一个默认位于数据目录下共享的表空间文件:ibdata#

2、innodb_file_per_table=ON,即使用独立表空间
每个表在数据库目录下存储两个文件:
tb_name.frm
tb_name.ibd
MyISAM:
每个表都在数据库目录下存储三个文件:
tb_name.frm
tb_name.MYD
tb_name.MYI

表空间:table space,由InnoDB管理的特有格式数据文件,内部可同时存储数据和索引

如何修改默认存储引擎:通过default_storage_engine服务变量实现
mysql>show engines;
mysql>show variable like '%engine%';

各存储引擎的特性:
InnoDB:
事务:事务日志-- #cd /data/mydata/ ib_logfile0/1
外键:
MVCC:
聚簇索引:
聚簇索引之外的其它索引,通常称为辅助索引
行级锁:间隙锁
支持辅助索引
支持自适应hash索引
支持热备份

MyISAM:
全文索引
压缩:用于实现数据仓库,能节约存储空间并提升性能
空间索引
表级锁
延迟更新索引

不支持事务、外键和行级锁
崩溃后无法安全恢复数据

适用场景:只读数据(读多写少;如果innodb设置为读提交的话也比myisam要好)、较小的表、能够容忍崩溃后的修改操作和数据丢失
mysql>show table status in mysql\G

ARCHIVE:
仅支持INSERT和SELECT,支持很好压缩功能;
适用于存储日志信息,或其它按时间序列实现的数据采集类的应用;

不支持事务,不能很好的支持索引;

CSV:
将数据存储为CSV格式;不支持索引;仅适用于数据交换场景;

BLACKHOLE:
没有存储机制,任何发往此引擎的数据都会丢弃;其会记录二进制日志,因此,常用于多级复制架构中作中转服务器;

MEMORY:
保存数据在内存中,内存表;常用于保存中间数据,如周期性的聚合数据等;也用于实现临时表
支持hash索引,使用表级锁,不支持BLOB和TEXT数据类型

MRG_MYISAM:是MYISAM的一个变种,能够将多个MyISAM表合并成一个虚表;

NDB:是MySQL CLUSTER中专用的存储引擎

第三方的存储引擎:

OLTP类:
XtraDB: 增强的InnoDB,由Percona提供;
编译安装时,下载XtraDB的源码替换MySQL存储引擎中的InnoDB的源码

PBXT: MariaDB自带此存储引擎
支持引擎级别的复制、外键约束,对SSD磁盘提供适当支持;
支持事务、MVCC

TokuDB: 使用Fractal Trees索引,适用存储大数据,拥有很压缩比;已经被引入MariaDB;

列式存储引擎:
Infobright: 目前较有名的列式引擎,适用于海量数据存储场景,如PB级别,专为数据分析和数据仓库设计;
InfiniDB
MonetDB
LucidDB

开源社区存储引擎:
Aria:前身为Maria,可理解为增强版的MyISAM(支持崩溃后安全恢复,支持数据缓存)
Groona:全文索引引擎,Mroonga是基于Groona的二次开发版
OQGraph: 由Open Query研发,支持图结构的存储引擎
SphinxSE: 为Sphinx全文搜索服务器提供了SQL接口
Spider: 能数据切分成不同分片,比较高效透明地实现了分片(shared),并支持在分片上支持并行查询;

索引类型:

聚簇索引
辅助索引

B树索引
R树索引
hash索引
全文索引

如何选择?
是否需要事务
备份的类型的支持
崩溃后的恢复
特有的特性

本文出自 “石头记” 博客,请务必保留此出处http://dodowolf.blog.51cto.com/793581/1434673
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: