• 什么是事务
  • 事务和锁
  • 提交事务
  • 回退事务
  • mysql 数据库控制台事务的几个重要操作
  • 提交或回滚
  • 事务的特性ACID
  • 1原子性Atomicity
  • 2一致性Consistency
  • 3隔离性Isolation
  • 4持久性Durability
  • 隔离级别


什么是事务

事务用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml语句要么全部成功,要么全部失败。如:网上转账就是典型的要用事务来处理,用以保证数据的一致性。

事务和锁

当执行事务操作时(dml语句),mysql会在被作用的表上加锁,防止其它用户改表表的结构.这里对我们用户来讲是非常重要的。

提交事务

当执使用commit语句可以提交事务.当执行了commit语句子后,会确认事务的变化、结束事务、删除保存点、释放锁,当使用commit语句结束事务子后,其它会话将可以查看到事务变化后的新数据

回退事务

在介绍回退事务前,我们先介绍一下保存点(savepoint)的概念和作用.保存点是事务中的一点.用于取消部分事务,当结束事务时,会自动的删除该事务所定义的所有保存点.

当执行rollback时,通过指定保存点可以回退到指定的点,这里我们作图说明

mysql 数据库控制台事务的几个重要操作

  • start transaction; //开始一个事务 (相当于set autocommit=0关闭自动提交。不同:如果事务结束了,成或败,都会将自动提交机制,回到start状态(初始状态)。
  • savepoint 保存点名 ;//设置保存点
  • rollback to 保存点名; //取消部分事务
  • rollback; //失败:取消全部事务
  • commit; // 成功: 提交事务.

提交或回滚。

在此基础上,执行完所有的sql语句。

判断是否都成功(出现错误,包括语法错误,和逻辑错误服务器错误)。

成:将结果提交,利用 commit

败:回到开始位置。Rollback

事务的特性(ACID):

以银行汇款为例,张三给李四转款300元.

1、原子性(Atomicity)

事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
即:张三减300, 李四+300 , insert银行流水, 这3个操作,必须都完成,或都不产生效果.

2、一致性(Consistency)

事务前后数据的完整性必须保持一致。
如:
(汇款前)张三的余额+李四的余额
(汇款后) 张三的余额+李四余额
比如: 张三只有280元, 280-300=-20,储蓄卡不是信用卡,不能为负,因此张三余0元.
将导致, 汇款后,2者余额,汇款前,差了20元.

3、隔离性(Isolation)

多个用户并发访问数据库时,一个用户的事务不能被其它用户的事物所干扰,多个并发事务之间的数据要相互隔离。

4、持久性(Durability)

一个事务一旦被提交,它对数据库中的数据改变就是永久性的。

事务的实现:

  1. 要求是事务支持的表类型
  2. 执行一组相关的操作前开启事务
  3. 整组操作完成后,都成功,则提交,如果存在失败,选择回滚,则会回到事务开始的备份点。

隔离级别

查看隔离级别

mysql> show variables like '%isolation%';

设置事务的级别:

mysql> set session transaction isolation level read uncommitted;
set session transaction isolation level 
[read uncommitted |  read committed | repeatable read |serializable]
  1. read uncommitted(未提交读): 事务的修改,即时没有提交,对其他事务也都是可见的。事务可以读取未提交的数据,称为”脏读(Dirty Read)”。 在实际应用中一般很少用(不符原子性、对并发控制低)。
  2. read commited(提交读): 这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。一个事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的。这个级别有时候也叫做不可重复读(Non-Repeatable Reads),因为两次执行同样的查询,可能会得到不一样的结果。
  3. repeatable read(可重复读): repeatable read解决了脏读的问题。该级别保证了在同一个事务中多次读取同样记录的结果是一致的。但理论上,无法解决幻读(Phantom Reads)的问题。所谓幻读,指的是当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取改范围的记录时,会产生幻行(Phantom Row)。InnoDB和XtraDB存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)解决了幻读的问题。(可重复读是mysql的默认事务隔离级别)
  4. serializeable (可串行化):它通过强制事务串行,避免了幻读问题。简单来说,serializeable 会在读取的每一行数据上加锁,所以肯导致大量的超时和锁争用的问题。这样隔离级别最高,但事务相互等待的等待长。在实用中,也不是很多。

隔离级别

脏读可能性

不可重复读可能性

幻读可能性

加锁读

read uncommitted

yes

yes

yes

no

read commited

no

yes

yes

no

repeatable read

no

no

yes

no

serializeable

no

no

no

yes