一、数据库事物补充
1.1 事务之间的相互影响
1.2 Mysql事务隔离级别
1.2.1 read uncommitted
1.2.2 read committed
1.2.3 repeatable read(重读读取)
1.2.4 serializable(串行化)
1.3 事务的作用范围
1.3.1 查询全局事务隔离级别
1.3.2 查询会话事务隔离级别
1.3.3 设置全局事务隔离级别
1.3.4 设置会话事务隔离级别
1.4 事务控制语句
1.4.1 使用 set 设置控制事务
1.4.2 事务控制语句案例
二、MySQL存储引擎
2.1 存储引擎概念
2.2 Mysql常用存储引擎
2.2.1 MYISAM
2.2.2 INNODB
2.3 修改存储引擎
2.3.1 通过 alter table修改
2.3.2 通过配置文件修改
2.4 小结
一、数据库事物补充
1.1 事务之间的相互影响
(1) 脏读: 一个事务读取了另一个事务未提交的数据,而这个数据是有可能回滚的。
(2) 不可重复读: 一个事务内两个相同的查询却返回了不同数据。这是由于查询时系统中其他事务修改的提交而引起的。
(3) 幻读: 一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,另一个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,操作前一个事务的用户会发现表中还有没有修改的数据行,就好象发生了幻觉一样。
(4) 丢失更新: 两个事务同时读取同一条记录,A先修改记录,B也修改记录(B不知道A修改过),B提交数据后B的修改结果覆盖了A的修改结果。
1.2 Mysql事务隔离级别
1.2.1 read uncommitted
读取尚未提交的数据 ——允许脏读
安全性最差,但性能最好(不使用)
1.2.2 read committed
读取已经提交的数据 ——不允许脏读
安全性较差,性能较好(oracle数据库默认)
1.2.3 repeatable read(重读读取)
可以解决脏读和不可重复读
安全性较高,性能较差(mysql数据库默认)
1.2.4 serializable(串行化)
完全串行化的读,将一个事务与其他事务完全地隔离。每次读都需要获得表级共享锁,读写相互都会阻塞。可以防止脏读,不可重复读取和幻读,但是事务的串行化会降低数据库的效率。
安全性高,性能差(不使用)
注意:mysql默认的事务处理级别是repeatable read,而Oracle和SQL Server是read committed 。
1.3 事务的作用范围
事务隔离级别的作用范围分为两种:
全局级:对所有的会话有效
会话级:只对当前的会话有效
1.3.1 查询全局事务隔离级别
1.3.2 查询会话事务隔离级别
1.3.3 设置全局事务隔离级别
1.3.4 设置会话事务隔离级别
1.4 事务控制语句
BEGIN 或 START TRANSACTION : 显式地开启一个事务。
COMMIT 或 COMMIT WORK : 提交事务,并使已对数据库进行的所有修改变为永久性的。
ROLLBACK 或 ROLLBACK WORK :
回滚会结束用户的事务,并撤销正在进行的所有未提交的修改。
SAVEPOINT S1 :
使用 SAVEPOINT 允许在事务中创建一个回滚点,一个事务中可以有多个SAVEPOINT,
S1"代表回滚点名称。
ROLLBACK TO [SAVEPOINT] S1: 把事务回滚到标记点。
1.4.1 使用 set 设置控制事务
SET AUTOCOMMIT=0; #禁止自动提交
SET AUTOCOMMIT=1; #开启自动提交,Mysql默认为1
SHOW VARIABLES LIKE 'AUTOCOMMIT'; #查看Mysq1中的AUTOCOMMIT值
1.4.2 事务控制语句案例
注意:如果没有开启自动提交,当前会话连接的mysql的所有操作都会当成一个事务直到你输入rollback l commit;当前事务才算结束。当前事务结束前新的mysql连接时无法读取到任何当前会话的操作结果。如果开起了自动提交,mysql会把每个sql语句当成一个事务,然后自动的commit。
当然无论开启与否,begin;commit l rollback;都是独立的事务。
二、MySQL存储引擎
2.1 存储引擎概念
MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎。存储引擎是MySQL将数据存储在文件系统中的存储方式或者存储格式。
2.2 Mysql常用存储引擎
INNODB、MYISAM、CSY、MEMORY、NDB、CLUSTER等,主要介绍INNODB和MYISAM。
2.2.1 MYISAM
5.5之前的默认存储引擎。
(1)MyISAM不支持事务,也不支持外键,访问速度快,对事务完整性没有要求。
(2)MyISAM在磁盘上存储成三个文件:
.frm文件存储表定义,
数据文件的扩展名为.MYD(MYData)。
索引文件的扩展名是.MYI(MYIndex)。
(3)表级锁定形式,数据在更新时锁定整个表
(4)数据库在读写过程中相互阻塞。
1)会在数据写入的过程阻塞用户数据的读取
2)也会在数据读取的过程中阻塞用户的数据写入
(5)数据单独写入或读取,速度过程较快且占用资源相对少
(6)支持的存储格式:
1)静态表,固定长度表。静态表是MYISAM的默认存储格式,静态表中字段都是非可变字段,每个记录都是固定长度的。存储快,方便缓存,有了故障容易恢复,缺点是占用空间比较多。
2)动态表,动态表可以包含可变字段,记录的长度是不固定的,优点是占用空间少。频繁更新数据,删除记录,会产生碎片,需要定期清理。myisamchk -r。出现故障恢复比较困难。
3)压缩表,myisamchk工具创建的,占据空间很小。每条记录都是单独压缩的,所以只有非常小的访问开支。
(7)应用场景:适合于单方向的任务场景、同时并发量不高、对于事务要求不高的场景。
2.2.2 INNODB
5.5之后MySQL的默认存储引擎,事务型速记引擎。
(1)特点:
支持4个事务隔离级别。
行级锁定,但是全表扫描仍然会是表级锁定。
读写阻塞与事务隔离级别相关。
能非常高效的缓存索引和数据。
表与主键以簇的方式存储。
支持分区、表空间,类似oracle数据库。
支持外键约束,5.5前不支持全文索引,5.5后支持全文索。
对硬件资源要求还是比较高的场合。
(2)适用场景
1) 业务需要事务的支持。
2) 论坛、微博,对数据一致性比较高的场景。
3) 访问量和并发量比较高的场景,innodb支持缓存,可以减少后台服务器的压力。
(3)innodb三个文件:
表名.frm (表结构文件)。
表名.idb (既是数据文件,又是索引文件)。
db.opt (属性文件)。
2.3 修改存储引擎
2.3.1 通过 alter table修改
2.3.2 通过配置文件修改
vim /etc/my.cnf
[mysqld]
default-storage-engine=INNODB
保存退出并使用下列命令重启服务
systemctl restart mysqld.service
2.4 小结
InnoDB支持事物,而MyISAM不支持事物;
InnoDB支持行级锁,而MyISAM支持表级锁;
InnoDB支持MVCC ,而MyISAM不支持。
InnoDB支持外键。而MyISAM不支持;
lnnoDB支持全文索引,而MyISAM支持。