目录
什么是事务
事务的ACIP特性
事务之间的影响
mysql隔离级别
事务隔离级别的作用范围
事务控制语句
mysql存储引擎
什么是事务
事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行。
事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元。
事务适用于多用户同时操作的数据库系统的场景,如银行、保险公司及证券交易系统等等。
事务是通过事务的整体性以保证数据的一致性。
说白了,所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位,事务的存在可以确保数据操作的正确性和可靠性,保证数据在操作过程中,不会出现异常或错误 。
事务的ACIP特性
ACID,是指在可靠数据库管理系统中,事务应该具有的四个特性:原子性(Atomicity),一致性(Consistency),隔离性(lsolation),持久性(Durability),这是可靠数据库所应具备的特性
原子性:指事务是一个不可再分割的工作单位,事务中的操作要么发生,要么不发生。
事务是一个完整的操作,事务的各元素是不可分的,事务的所有元素必须作为一个整体提交或回滚,如果有一个环节出现问题,那么整个事务将失败
一致性: 事务执行前后,数据库从一个一致状态转换到另一个状态,保证数据的完整性和准确性。
当事务完成时,数据必须处于一致状态。在事务开始前,数据库中存储的数据处于一致状态。
在正在进行的事务中,数据可能处于不一致的状态。当事务成功完成时,数据必须再次回到已知的一致状态
隔离性: 多个并发事务相互隔离,互不干扰,每个事务独立执行,避免数据混乱和不一致
持久性: 一旦事务提交,其对数据库的修改是永久性的,即使系统发生故障或重启,修改的数据也不会消失。
事务之间的影响
脏读:
当有两个事务在访问同一个数据时,一方对数据进行了修改,但最后选择了回滚(没有写入到数据库中),但另一方事务在他回滚前读到了这个被修改的数据,这就是脏数据。也就是脏读。
不可重复读:
一个事务两次相同的查询,返回的不同的数据,这是由于其他事务修改并提交所造成的。
幻读:
一个事务1在对表内容进行修改,而且是涉及到全表的,另一个事务2此时也对此表内容进行修改,并且在事务1之前提交了。此时,事务1修改完后,发现刚刚的更改对某些数据没起作用,这是事务2刚刚插进来的数据,让操作事务1的用户感觉很魔幻,出现了幻觉,也就是幻读。
丢失更新
两个事务同时读取同一条记录 事务1先修改记录,事务2也修改记录(2不知道1修改过),2提交数据后会覆盖掉1的修改记录。但这不是意味着事务1的操作失败了,事务1成功了,只是记录被事务2的记录覆盖掉了
mysql隔离级别
read uncommitted (安全性最差,但性能好 不使用)
read uncommitted:(读取尚未提交的数据)不解决脏读,允许脏读,即使未提交,本事务也能看到修改后的数据值。也就是可能读取到其他会话中未提交事务修改的数据
read committed (Oracle 数据库默认 安全性较差,性能较好)
read committed:(提交读)读取已经提交的数据,可以解决脏读,只能读取已经提交的数据
repeatable read (mysql数据库默认 安全性较高,性能较差)
repeatable read:(可重复读)重复读取,可以解决脏读和不可重复读。无论其他事务是否修改并提交了数据,在这个事务内看到的数据始终不受其他事务影响
serializable (安全性最高,性能最差 不使用)
serializable:(串行化)可以解决脏读,不可重复读,幻读。相当于锁表,完全串行化的读,每次读都需要获得表级共享锁,读写相互阻塞
事务隔离级别的作用范围
会话级:对当前的会话有效
全局级:对所有的会话有效
查询全局事务隔离级别
查询会话事务隔离级别
设置全局事务隔离级别
设置会话事务隔离级别
事务控制语句
begin 或 start transaction:显式地开启一个事务
commit 或 commit work:提交事务,并使已对数据库进行的所有修改变为永久性的
rollback 或 rollback work:回滚事务,撤销当前所有未提交的所有操作并结束事务
savepoint 回滚点名 :使用savepoint 允许在事务创建一个回滚点,一个事务可以创建多个回滚点
(回滚点只会存在当前事务中,事务结束,回滚点消失)
rollback to [savepoint] 回滚点名:把事务回滚到标记点
set autocommit = 0; 禁止自动提交
set autocommit=1; 开启自动提交,mysql默认1
show variables like 'autocommit' 查看mysql中的autocommit值
事务提交
事务回滚
设置回滚点
如果没有开启自动提交,当前会话连接的mysql的所有操作都会当成一个事务直到你输入rollback|commit , 当前事务结束前新的mysql连接时无法读取到任何当前会话的操作结果。
如果开启了自动提交,mysql会把每个sql语句当作一个事务,然后自动的commit,当然无论开启与否,begin, commit|rollback 都是独立的事务。
mysql存储引擎
存储引擎介绍
MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎
存储引擎是MySQL将数据存储在文件系统中的存储方式或者存储格式
mysql的常用存储引擎
Myisam
myisam不支持事务,也不支持外键约束,只支持全文索引,数据文件和索引文件是分开保存的
myisam适合查询,插入为主的应用场景
myisam在磁盘上存储成三个文件,文件名和表名相同,但是扩展名分别为:
.frm 文件存储表结构的定义
.MYD(MYData) 数据文件的扩展名
.MYI(MYIndex) 索引文件的扩展名
表级锁定形式,数据在更新时锁定整个表
数据库在读写过程中相互阻塞: 串行操作,按照顺序操作,每次在读或写的时候会把全表锁起来
会在数据写入的过程阻塞用户数据的读取,也会在数据读取的过程中阻塞用户的数据写入
特性:数据单独写入或读取,速度过程较快且占用资源相对少
MyISAM 表支持 3 种不同的存储格式:
静态表(固定长度):静态表是默认的存储格式。静态表中的字段都是非可变字段,这样每个记录都是固定长度的,这种存储方式的优点是存储非常迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态表多。固定长度10,存储非常迅速,容器缓存,故障之后容易恢复
动态表 :动态表包含可变字段,记录不是固定长度的,这样存储的优点是占用空间较少,但是频繁的更新、删除记录会产生碎片,需要定期执行 OPTIMIZE TABLE 语句或 myisamchk -r 命令来改善性能,并且出现故障的时候恢复相对比较困难
压缩表 :压缩表由 myisamchk 工具创建,占据非常小的空间,因为每条记录都是被单独压缩的,所以只有非常小的访问开支。
myisam:适合于单方向的任务场景、同时并发量不高、对于事务要求不高的场景
lnnoDB
lnnodb 支持事务,读写阻塞与事务的隔离级别有关,能高效的缓存索引和数据,表与主键以簇的方式存储,支持分区,表空间,支持外键约束,5.5版本后支持全文索引,对硬件资源要求还是比较高的场合,采用行级锁定,但在全表扫描时仍然是表级锁定
InnoDB 中不保存表的行数,如 select count(*) from table; 时,InnoDB 需要扫描一遍整个表来计算有多少行,但是 MyISAM 只要简单的读出保存好的行数即可。需要注意的是,当 count(*)语句包含 where 条件时 MyISAM 也需要扫描整个表
对于自增长的字段,InnoDB 中必须包含只有该字段的索引
但是在 MyISAM 表中可以和其他字段一起建立组合索引,清空整个表时,InnoDB 是一行一行的删除,效率非常慢。MyISAM 则会重建表(truncate)
mysql从5.5.5版本开始,默认的存储引擎为lnnodb
查看系统支持的存储引擎
show engines;
查看表使用的存储引擎
show table status from 库名 where name='表名'\G;(命令太长,不推荐使用)
show create table 表名;
修改存储引擎
alter table 表名 engine=引擎名;
创建表时指定引擎
修改配置文件,但需要重启mysql,对修改了配置文件并重启mysql服务后新创建的表有效,已经存在的表不会有变更。
vim /etc/my.cnf
修改此模块下的内容
[mysqld]
default-storage-engine=INNODB
systemctl restart mysqld