[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;