此篇内容是给自己总结一下最近的学习成果。
事务就是由一个或者多个sql语句组成,是作为一个整体,在执行的时候要么都执行成功,要么都执行失败。不可能存在说有执行成功也有执行失败。
数据是通过不同的存储引擎进行存储,然不同的存储引擎都有各自的特点。
在这里支持事务的有InnoDB
ps:我们可以通过 show engines 来查看mysql支持的存储引擎
一、事务的特性
原子性 :是不可分割的最小操作单位,要么同时执行成功,要么都执行失败
一致性 :指的是在数据进行操作时,保证数据在操作前以及操作后一致。
ps:如我们在买东西,付钱的状态,要么钱在我们这,还没付出去。要么钱在商家身上了,已经从我们这付出去了。而其他事务只能看到这俩个状态的其中一个。
隔离性 :多个事务同时操作相同数据库的同一个数据时,一个事务的执行不受另外一个事务的干扰。
持久性 :当事务提交或回滚后,数据库会持久化的保存数据
二、事务的分类
隐式事务:没有明显的开启和结束事务的标志
我们在正常的对表中数据进行插入,更新,删除操作时,本质上就是一个事务,只不过是不需要提交 自动提交
显式事务:具有明显的开启和结束事务的标志
首先 对自动提交做出修改让它取消自动提交事务功能 set autocommit=0;
0:关闭 1:开启
接下来就是开启事务 start transaction;
此时我们可查询一下当前 提交事务的状态 SELECT @@autocommit;
如果 autocommit=0 则可以开始事务的进行
然后就是对事务的进行操作
结束事务 commit 在commit之前 相当于创建了虚拟的表,并在旧表的基础上执行事务的操作到虚拟表,当commit提交后,旧表的数据才正式为新的数据
回滚事务 rollback 就是之前的事务不执行,回滚到执行前的状态
事务的并发问题
并发问题的产生 如何产生?
当多个事务同时操作同一个数据库的相同数据 便会产生
并发问题有哪些?
- 脏读:一个事务读取到了另外一个事务未提交的数据
- 不可重复读:同一个事务中,多次读取到的数据不一致
- 幻读:一个事务读取数据时,另外一个事务进行更新,导致第一个事务读取到了没有更新的数据
如何处理并发问题?
设置隔离级别 在mysql中有四种事务的隔离级别,它们的作用就是隔离并发运行的事务,让它们不受其他事务影响
事务的隔离级别有哪些?
READ UNCOMMITTED
READ COMMITTED:可以避免脏读
REPEATABLE READ:可以避免脏读、不可重复读和一部分幻读
SERIALIZABLE:可以避免脏读、不可重复读和幻读
在mysql中 默认为第三种隔离级别
查看隔离级别
由于我的mysql版本比较靠近新版本 select @@transaction_isolation
设置隔离级别
set session/global transaction isolation level 隔离级别名;
隔离级别越高,安全性也越高,但效率越低
这些便是本篇总结的知识了,各位看客也可以根据自己的实际例子进行操作