事务
什么是事务
事务就是一次对数据库操作的若干单元的一条或多条sql的管理 ,事务管理的目标就是完整性,要么全部执行,要么全不执行。
事务的特性:ACID,原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
原子性(Atomicity)
一个事务中的 所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。如果一个事务中间执行时报错,那么已经执行sql语句会回滚到事务开始前的状态。
隔离性(Isolation)
控制多个事务在并发读写时,保证互不影响,隔离级别分别有四种: 读 未提交、读 已提交、可重复读、串行化。
持久性(Durability)
事务结束之后,对数据的修改时永久性的,即使系统故障也不会丢失。
一致性(Consistency)
保证对数据操作的完整性。在事务开始前和事务开始后,数据库的完整性需要保持。前面提到的原子性、隔离性、持久性都是为了保证事务的一致性。
事务的隔离级别
为什么会有隔离级别
MySQL 是一个服务器/客户端架构的软件,对于同一个服务器来说,可以有若干个客户端与之连接,每个客户端与服务器连接上之后,就可以称之为一个会话。我们可以同时在不同的会话里输入各种语句,这些语句可以作为事务的一部分进行处理。不同的会话可以同时发送请求,也就是说服务器可能同时在处理多个事务,这样子就会导致不同的事务可能同时访问到相同的记录。我们前边说过事务有一个特性称之为隔离性,理论上在某个事务对某个数据进行访问时,其他事务应该进行排队,当该事务提交之后,其他事务才可以继续访问这个数据。但是这样子的话对性能影响太大,所以设计数据库的大叔提出了各种隔离级别,来最大限度的提升系统并发处理事务的能力。
只有 InnoDB 支持事务,所以这里说的事务隔离级别是指InnoDB 下的事务隔离级别
查看隔离级别
SELECT @@global.transaction_isolation,@@transaction_isolation;
设置隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
隔离级别
读 未提交
一个事务可以读到另一个事务未提交的数据。问题可能会出现回滚,另一个事务如果回滚,那么这个事务读到的就是脏数据,称为脏读
读已提交
一个事务只能读到另一个事务已提交的数据。读 已提交 解决了脏读的问题,但是会带来不可重复读的问题:A事务开始读到的一个数据10,之后B事务将10修改为5并且提交,A事务再读就又是5,称为不可重复读。
可重复读
同一事务多次读到的相同的数据仍是一样,不管他有没有被其他事务修改并提交的。解决了不可重复读的问题。
串行化
事务串行执行,避免了以上的所有问题。