[mysql] 事务

前言

事务是数据库中很重要的一种机制,作为一个后台开发人员,事务是我们必须要了解的机制。写下这篇文章,主要是为了能够加深我对事务的理解,也是为了以后可以方便查看。要了解事务,我们需要关注以下三个大佬: 事务的基本要素 、 事务的并发问题 、 事务的隔离级别 。下面就让我来依次介绍这三个大佬。

事务的基本要素(ACID)

 原子性(Atomicity) :一个事务里面的一系列操作要么全做,要么全不做,事务是不可分割的一个整体。

 一致性(Consistency) :事务开始前和结束后,数据库的完整性约束没有被破坏。一个事务的中间状态对外部不可见。比如,A向B转账,不可能出现A扣了钱,B却没有收到的情况。

 隔离性(Isolation) :同一时间只允许一个事物访问同一个数据,不同的事务之间彼此没有任何干扰。

 持久性(Durability) :事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

注:原子性是事务隔离的基础,隔离性和持久性是手段,最终目的是为了保持数据的一致性。

事务的并发问题

 脏读 :事务A读取了事务B更新的数据,然后事务B回滚了,那么事务A读取的数据是脏数据。

 不可重复读 :事务A读取数据d1,事务B对数据d1进行更新操作并且提交了事务B,事务A再次读取数据d1,那么事务A第一次和第二次读取的数据不一致。

 幻读 :事务A查询id=1的数据,发现没有,事务b插入了id=1的数据并且提交了事务B,事务A插入id=1的数据报错,这个时候事务A就产生了幻读。

事务隔离级别

  读未提交(read-uncommitted) :不可以防止任何的事务并发问题,但是执行效率最高。

 读已提交(read-committed) :可防止脏读,效率低于读未提交。

 可重复读(repeatable-read) :可防止脏读、不可重复读,效率低于读已提交。(注:mysql默认事务隔离级别)

 串行化(serializable) :可防止脏读、不可重复读、幻读,效率最低。

数据库相关操作

查看数据库隔离级别:

select @@tx_isolation;

设置当前会话的事务隔离级别:

set session transaction isolation level read uncommitted;

设置全局的事务隔离级别

set global transaction isolation level repeatable read;
原文地址:https://www.cnblogs.com/cafebabe-yun/p/11359743.html