MySQL 作为多用户的数据库管理系统,可以允许多个用户同时登录数据库进行操作。当不同的用户访问同一份数据时,在一个用户更改数据的过程中可能会其他用户同时发起更改请求,这样不仅会造成数据的不准确,而且会导致服务器死机。为了解决这一问题,使数据可以从一个一致的状态变为另一个一致的状态, MySQL在设计的过程中加入了事务这一概念,以此来保证数据的准确性和一致性。本章将详细讲解数据库中事务的概念和基本操作。

事务

事务处理机制在程序开发和后期的系统运行维护中起着非常重要的作用,既保证了数据的准确,也使得整个数据系统更加安全

在默认设置下

MySQL 中的事务为自动提交模式,每一条语句都处于一个单独的事务中,在这条语句执行完毕后,如果执行成功则隐式提交事务,如果执行失败则隐式回滚事务。正常的事务管理是一组相关的操作处于一个事务之中,因此在执行正常的事务时,可以使用相关指令关闭数据库的自动提交模式,随后用户将一直处于某个事务中,直到用户执行一条 COMMIT(提交)或者ROLLBACK(回滚)命令后才会结束当前事务。如果用户不想关闭事务的自动提交模式,可以使用BEGIN 或者 START TRANSACTION 命令开启事务,事务开启后便可以执行相关的事务语句,事务提交后自动回到自动提交模式。另外,事务的回滚操作只能撤销所有未提交的修改,对已经提交的事务不能使用 ROLLBACK 命令进行回滚

事务:保证唯一性和准确性

commit 提交

在没有提交之前的所有操作不是真正的修改,只有执行commit提交之后才会真正生效

rollback 回滚

回到命令没有执行之前的状态
回滚的操作只能回滚未提交(没有执行commit的)的数据,至于已经执行commit的操作无法回滚到之前的状态

数据库的自动提交模式

查看数据库自动提交模式是开启还是关闭:show variables like (on开/0FF关)
手动关闭自动提交模式:set autocommit=0;(临时生效)

并发与并行

1.并发控制

并发( Concurrency)控制是指通过把时间分成若干段,让多个线程快速交替轮换执行,使得在宏观上具有多个线程同时执行效果的控制方法
具体来说,当有多个线程时,如果系统只有一个 CPU,则根本不可能真正同时执行一个以上的线程,只能把 CPU 运行时间划分成若干个时间段,再将时间段分配给各个线程,在一个时间段的线程代码运行时,其他线程处于挂起状态,这种方式被称为并发。并发控制的目标是充分利用处理器的每一个核,以达到最高的处理性能。

2.并行

并行( Parallel)指在同一时刻有多条指令在多个 CPU 上同时执行,无论从微观还是从宏观来看,多个线程都是同时执行的
当系统有一个以上 CPU 时,线程的操作有可能非并发。当一个 CPU 执行一个线程时,另一个 CPU 可以执行另一个线程,两个线程互不抢占 CPU 资源,可以同时进行,这种方式我们称之为并行。
并行在多处理器系统中存在,而并发可以在单处理器和多处理器系统中存在,并发能够在单处理器系统中存在是因为并发是并行的假象。并行要求程序能够同时执行多个操作,而并发只要求程序“假装”同时执行多个操作。

事务的特征

事务是一个整体,相互不影响,只有执行成功后才会对数据进行永久性的修改。在 MySQL 中,事务具有 4 个特性,如表所示。
image.png

事务出现的一些情况

1.脏读
2.不可重复读
3.幻读
脏读:脏读就是指:当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。

2.不可重复读
事务B读取了两次数据资源,在这两次读取的过程中事务A修改了数据,导致事务B在这两次读取出来的数据不一致,这种在同一个事务中,前后两次读取的数据不一致的现象就是不可重复读。
3.幻读
事务B前后两次读取同一个范围的数据,在事务B两次读取的过程中事务A新增了数据,导致事务B后一次读取到前一次查询没有看到的行。
幻读和不可重复读有些类似,但是幻读强调的是集合的增减,而不是单条数据的更新。

事务的隔离级别

隔离级别由低到高:
—读未提交(不能避免脏读,实际运用很少,安全性不高)
—读已提交(可以避免脏读,但是不能避免可重复读和幻读)
—可重复读(可以避免脏读已经不可重复读,1 但是无法避免幻读)
—可串行化(能够解决幻读问题,通过添加锁来去解决所有的情况,只能有一个用户进行操作,只有前一个用户执行commit提交才可以由后面的用户执行操作,一旦没有执行commit提交那么只能等待)

查看当前数据库的隔离级别

select  @@tx_isolation;

用户自行更改隔离级别

语法:set session transaction isolation level 隔离级别;

(隔离级别:read committed(读已提交) 、read uncommitted(读未提交) repeatable read (重复读)、 serialzable(可串行化))

例如set session transaction isolation level read uncommitted;
代表把用户的隔离级别改为读未提交
例如:set session transaction isolation level read committed; 
代表把用户的隔离级别改为读已提交