前言
MySQL是我们学习或工作常用的数据库,前段时间我在一些面试课上看到有好多的面试官在问到数据库时总会提到事务.MySQL只有innodb引擎支持事务,现在介绍一下事务的相关知识.
开搞
1.事务
1.事务是一个不可分割的执行单元
2.事务作为一个整体,要么一起执行成功,要么一起回滚
2.事务特性(ACID)
1.原子性(Atomicity):事物是一个整体,不可再分,要么一起执行,要么一起不执行
2.一致性(Consistency):事务完成时,数据必需处于一致状态
3.隔离性(Isolation):每一个事物都是相互隔离的(会把表锁住,只能在一个时段内操作一个表)
4.永久性(Durability):事务完成后,対数据的修改是永久性的
3.事务操作
1.开启事务:start transaction 或 begin [work] 不提交和回滚事务不真正执行,而是放到缓存区
2.提交(结束)事务: commit 将缓存区中的事务统一执行
3.回滚: rollback回到事务语句开始时的状态
4.回滚点: savepoint 回滚点名字,回到回滚点语法:rollback to 回滚点名
5.查询: show variables like "%commit%"
6.关闭自动: set autocommit = 0,设置为1为自动
4.并发访问的问题
1.脏读: 一个事务读取到了另一个事务未提交的数据
2.丢失修改:一个事务读取数据,第二个事务也读取数据,第一个事务修改完,第二个事务也修改了,造成第一个事物修改丢失
3.不可重复读: 一个事务中两次读取到的数据内容不一致,这是另一个事务对数据修改引发的问题
4.幻读: 一个事务中两次读取到的数据条目数量不一致,这是另一个事务对数据库添加或删除造成的
注:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表
5.对于并发访问出现的问题的解决方法就是设置隔离级别,那什么是隔离级别?
隔离级别是用来限定事务内外的哪些改变可见,哪些不可见。低的隔离级别一般支持更高的并发处理,并拥有更低的系统开销
6.事务的隔离级别
读未提交 read uncommitted 隔离级别最低,效率最高,对于三种问题都无法解决
读已提交 read committed 避免脏读,是大多数数据库系统的默认隔离级别(但不是MySQL默认的)
可重复读 repeatable read 避免脏读和不可重复读,是MySQL的默认事务隔离级别
串行化 serializable 可避免一切并发访问问题,效率最低
7.设置隔离级别
查询:show variables like "%isolation%"
设置:set global transaction isolation level 级别
网友评论