一、事务的概述

1.1 概念

保证事务中的所有操作都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。

当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),那么这些修改就永久地保存下来;要么数据库管理系统将放弃所作的所有修改,整个事务回滚(rollback)到最初状态。

1.2 事务的原理

事务开启之后,所有的操作都会临时保存到事务日志,事务日志只有在得到commit命令才会同步到数据库表中,其他任何情况都会清空事务日志(rollback,断开连接)。

1.3 事务的使用场景

如果在某个业务中需要执行多条SQL语句,这种情况一般是需要使用到事务,从而保证多条SQL语句执行同时成功或同时失败。

例如:转账、批量删除、从购物车中提交订单等等操作。

1.4 事务的四大特性(ACID)

1. 原子性

原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

2. 一致性

事务必须使数据库从一个一致性状态变换到另外一个一致性状态。

3. 隔离性

事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

4. 持久性

持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。

二、MySQL进行事务管理操作

2.1 自动事务(MySQL默认)

MySQL默认是自动提交事务的,一条SQL语句就是一个事务。

2.2 开启事务

2.2.1 方式一:手动开启事务

START TRANSACTION

手动开启事务之后,执行的SQL语句都不会真正改变数据库中的数据,需要用户手动提交事务才能够真正执行SQL语句。

2.2.2 方式二:设置MySQL中的自动提交参数

  • 1、查看MySQL中事务是否自动提交
show variables like '%commit%'
  • 2、设置自动提交的参数为OFF
set autocommit = 0

2.2.3 提交和回滚事务

1、提交事务

当事务中的SQL语句执行完毕之后,没有出现任何问题,我们需要在最后提交事务,让这些SQL语句真正执行去改变数据库中的数据。

commit
2、回滚事务

当执行这个事务中的SQL语句的过程中,一旦出现问题或者异常,则需要回滚事务,从而回到SQL语句执行之前的状态。

rollback

三、事务的隔离级别

3.1 不考虑事务的隔离性会引发的问题

事务在操作时的理想状态如下:
所有的事务之间保持隔离,互不影响。因为并发操作,多个用户同时访问同一个数据。可能引发并发访问的问题。

并发访问的问题

含义

脏读

一个事务读取到了另一个事务中尚未提交的数据

不可重复读

一个事务中两次读取的数据内容不一致,要求的是一个事务中多次读取时数据是一致的,这是事务update时引发的问题

幻读

一个事务中两次读取的数据的数量不一致,要求在一个事务多次读取的数据的数量是一致的,这是insert或delete时引发的问题

3.2 事务隔离级别

级别

名字

隔离级别

脏读

不可重复读

幻读

数据库默认隔离级别

1

读未提交

read uncommitted




2

读已提交

read committed




Oracle

3

可重复度

repeatable read




MySQL

4

串行化

serializable




最高的隔离级别

隔离级别越高,性能(效率)越差,安全性越高。

3.2.1 设置隔离级别

  • 设置事务隔离级别
set session transaction isolation level 隔离级别;
  • 查询当前事务隔离级别
select @@tx_isolation

学海无涯苦作舟