MySQL-事务

Author Avatar
丁起男 12月 22,2020
  • 在其它设备中阅读本文章

MySQL-事务

事务的概念

事务是由一条或多条sql语句组成的一个执行单元,这个单元作为一个不可分割的执行整体,要么全部执行成功,要么全部执行失败。若其中有一条执行失败则事务会回滚到事务开始之前的状态。

事务有四个属性(ACID)

  • 原子性(atomicity):指事务是一个不可分割的整体,事务中的操作要么都执行,要么都不执行。
  • 一致性(consistency):事务必须是数据库从一个一致性状态变为另一个一致性状态。
  • 隔离性(isolation):指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及其使用的数据对并发的其他事务是隔离的,并发执行的各个事务之前不能相互干扰。
  • 持久性(durability):一个事务一旦提交,对数据库中数据的改变就是永久性的

分类

事务有隐式事务显示事务之分,区别在于有没有显示的事务开启和结束标记。

默认是insert、update、delete语句都是会自动提交的,事务提交后是不能够回滚的。

这和数据库的autocommit属性有关,默认情况下都是开启自动提交的。

可以通过show variables查看autocommit属性

操作

关闭自动提交

set autocommit = 0; #1是开启

开启事务

begin;
start transaction;

提交事务

commit;
commit work;

回滚事务

rollback;
rollback work;

隔离级别

对于并发运行的多个事务,当这些事务访问相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题:

  • 脏读:对于两个事务a、b,a读取了已经被b更新但还没有提交的数据之后,b回滚了,则a读取的数据就是无效的
  • 不可重复读:对应两个事务a、b,a读取数据后,b更新了a读取的数据,此时a再次读取该数据会和之前不一样
  • 幻读:对于两个事务a、b,a读取一个表中的数据后,b向该表中插入了新的数据,a再次读取这个表时发现多出了新的数据

数据库中有多种隔离级别,不同的隔离级别对应不用的干扰程度,隔离级别越高,数据一致性就越好,但并发性越弱。

数据库提供的隔离级别:

隔离级别描述问题
read_uncommitted(读未提交)允许事务读取其他事务未提交的变更脏读、不可重复读、幻读
read_committed(读已提交)只允许事务读取其他事务已提交的变更不可重复读、幻读
repeatable_read(可重复读)确保事务多次读取同一个字段时数据是前后一致的,在这个事务持续期间,禁止其他事务对这个字段进行修改幻读
serializable(串行化)在一个事务读取一个表的数据时,禁止其他事务对该表进行操作

操作

查看隔离级别

select @@tx_isolation;

设置隔离级别

#这种当前连接的隔离级别
set [session] transaction isolation level 隔离级别;
# 设置全局的隔离级别
set global transaction isolation level 隔离级别;

保存点

事务的保存点(savepiont)其实就是指定事务可回滚到的一个节点,有时我们并不一定要将整个事务的所有操作都进行回滚,而是只回滚该事务中的某一部分操作,这个时候就需要用到事务的保存点,一个事务中可以有多个保存点,多个保存点间根据名称区分。

操作

创建保存点

savepoint 保存点名;

删除保存点

release savepoint 保存点名;

回滚到保存点

rollback to 保存点名;