数据库事务

事务

  • 1. 概述
    • 1.1 事务4大特性ACID
    • 1.2 事务的状态
  • 2. 使用
    • 2.1 显式事务(建议)
    • 2.2 隐式事务
    • 2.3 会隐式提交数据的一些情况
  • 3. 隔离级别
    • 3.1 数据并发会带来的问题
      • 3.1.1 脏写(Dirty Write)
      • 3.1.2 脏读(Dirty Read)
      • 3.1.3 不可重复读(Non-Repeatable Read)
      • 3.1.4 幻读(Phantom)
    • 3.2 SQL中的4种隔离级别
    • 3.3 MySQL中的4种隔离级别
      • 3.3.1 查看事务隔离级别
      • 3.3.2 设置事务隔离级别

1. 概述

  • MySQL数据库中,目前只有InnoDB存储引擎支持事务
  • 事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态;
  • 事务处理的原则:保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。当在一个事务中执行多个操作时,要么所有的事务都被提交( commit ),那么这些修改就永久地保存下来;要么数据库管理系统将 放弃所作的所有修改 ,整个事务回滚( rollback )到最初状态。

1.1 事务4大特性ACID

  • 原子性(Atomicity):事务是不可再分的最小工作单位,其中包含的操作要门全部成功提交,要么全部失败回滚到最初状态;
  • 一致性(Consistency):事务在执行前后,数据从一个合法状态到另一个合法状态。合法状态的定义具有主观性,只要符合预定义约束就说明该状态是合法的;
  • 隔离性(Isolation):指事务执行过程中不能被其他事务所干扰,即一个事务内部操作对并发的其他事务是隔离的,并发执行的事务之间不能互相干扰;
  • 持久性(Durability):指事务一旦被提交,对应数据就永久保存下来

1.2 事务的状态

  • 事务状态可分为以下五种:
    1)活动的:事务内部操作正在执行过程中,称事务处于活动状态;
    2)部分提交的:事务内部最后一个操作执行结束,此时数据更新处于内存级别,还未刷新到磁盘中,称事务处于部分提交的状态;
    3)提交的:事务内部操作执行结束且成功提交,称事务处于提交的状态;
    4)失败的:事务内部操作异常停止或提交刷盘时出现错误时,称事务处于失败的状态;
    5)中止的:事务处于失败状态时通过回滚操作将事务状态回到最初,称事务处于中止的状态;
    数据库事务_第1张图片
  • 事务的最终状态只有两种:1)成功提交:提交的;2)成功回滚:中止的

2. 使用

  • 事务的使用分为显式事务隐式事务两种;

2.1 显式事务(建议)

  • 显式事务即手动开启、手动进行事务提交等操作;
  • 显式事务执行流程如下:
    1)开启事务:可通过start transaction或begin两种方式开始事务,其中start transaction方式使用范围较广,可在其后指定read only(只读事务)read write(读写事务,默认情况),结合with consistent sanpshot开启一致性读;
    2)事务内部的一些列操作
    3)事务结束,对应两种情况:①成功提交commit;②成功回滚rollback
  • 显式事务中,还可以使用保存点savepoint 保存点名称创建保存点,然后使用rollback to 保存点名称将事务回滚到指定保存点。此外,要想删除保存点,可使用release savepoint 保存点名称

2.2 隐式事务

  • 隐式事务指通过autocommit变量控制是否自动进行事务提交,默认autocommit=on
  • autocommit=on情况下,每条独立的SQL被认为是一个事务,执行完毕后会自动提交;
  • 可通过以下两种方式关闭自动提交:
    1)使用set autocommit=off关闭自动提交;
    2)手动开启事务,则对应操作不会自动提交;

2.3 会隐式提交数据的一些情况

  • 数据定义语言(Data definition language,缩写为:DDL);
  • 隐式使用或修改mysql数据库中的表;
  • 事务控制或关于锁定的语句;
    ① 当我们在一个事务还没提交或者回滚时就又使用 START TRANSACTION 或者 BEGIN 语句开启了另一个事务时,会 隐式的提交上一个事务。
    ②当前的 autocommit 系统变量的值为 OFF ,我们手动把它调为 ON 时,也会隐式的提交前边语句所属的事务。
    ③ 使用 LOCK TABLES 、 UNLOCK TABLES 等关于锁定的语句也会隐式的提交前边语句所属的事务。
  • 加载数据的语句;
  • 关于MySQL主从复制的一些语句;
  • 其它的一些语句,如优化表操作等;

执行上面所述操作时,会自动提交上一个事务

3. 隔离级别

  • MySQL数据库是一种客户端/服务器架构的软件,同一台服务器可与多台客户端进行连接;
  • 服务器与一个客户端之间的连接,称为一个会话Session
  • 用户可在自己的会话中向服务器发送请求,该请求属于当前会话的某个事务;
  • 服务器为同时处理多个事务,会提供并发操作,当服务器在处理某事务时,其他事务排队等待;
  • 并发操作的缺点是性能下降,为提升性能,一般会在事务隔离性与性能之间做一定的平衡

3.1 数据并发会带来的问题

3.1.1 脏写(Dirty Write)

  • 对于两个事务 Session A、Session B,如果事务Session A 修改了另一个未提交事务Session B 修改过的数据,那就意味着发生了 脏写,之后若 Session B 回滚 ,Session A 的写入操作就是无效 的。
  • 可理解为Session A事务白写了;

3.1.2 脏读(Dirty Read)

  • 对于两个事务 SessionA、SessionB,SessionA 读取了已经被SessionB更新但还没有被提交的字段,之后若 SessionB 回滚 ,SessionA 读取 的内容就是 临时且无效 的。
  • 可理解为SessionA事务白读了,读取的数据是错误的;

3.1.3 不可重复读(Non-Repeatable Read)

  • 对于两个事务Session A、Session B,Session A 读取了一个字段,然后 Session B 更新了该字段(已提交),之后Session A 再次读取同一个字段, 值就不同了。那就意味着发生了不可重复读。

3.1.4 幻读(Phantom)

  • 对于两个事务Session A、Session B, Session A 从一个表中 读取 了一个字段, 然后 Session B 在该表中插 入 了一些新的行(已提交),之后, 如果 Session A 再次读取 同一个表, 就会多出几行。那就意味着发生了幻读。
  • 幻读问题对应的记录称为幻影记录

3.2 SQL中的4种隔离级别

  • 为了解决数据并发带来的四种问题,SQL提供了四种隔离级别:读未提交<读已提交<可重复读<串行化
  • 隔离级别越高,数据并发性能越差
    数据库事务_第2张图片
  • 为了提高数据并发性能,SQL支持设置不同的隔离级别以做好隔离性与并发性能的平衡:隔离级别越低,隔离性越差,并发性能越好
    1)读未提交:只能解决脏写问题,一般不会选择该隔离级别;
    2)读已提交:可解决脏写、脏读问题,为Oracle数据库默认隔离级别;
    3)可重复读:可解决脏写、脏读、不可重复读问题,为MySQL数据库默认隔离级别;
    4)串行化:可解决脏写、脏读、不可重复读以及幻读问题,并发性能最差;
    数据库事务_第3张图片
    以上四种隔离级别均可解决脏写问题!!!!

3.3 MySQL中的4种隔离级别

  • MySQL支持SQL提供的四种隔离级别;
  • MySQL数据库默认隔离级别:可重复读;

3.3.1 查看事务隔离级别

select variables like 'transaction_isolation';

3.3.2 设置事务隔离级别

  • 可通过指定GLOBAL或SESSION,设置该操作对数据库的影响范围;
SET [GLOBAL|SESSION] TRANSACTION_ISOLATION = '隔离级别'
#其中,隔离级别格式:
> READ-UNCOMMITTED
> READ-COMMITTED
> REPEATABLE-READ
> SERIALIZABLE

参考《尚硅谷》

你可能感兴趣的:(MySql,Java开发,数据库,java,开发语言,mysql)