事务是数据库中很重要的一种机制,做为一个后台开发人员,事务是咱们必需要了解的机制。写下这篇文章,主要是为了可以加深我对事务的理解,也是为了之后能够方便查看。要了解事务,咱们须要关注如下三个大佬: 事务的基本要素 、 事务的并发问题 、 事务的隔离级别 。下面就让我来依次介绍这三个大佬。mysql
原子性(Atomicity) :一个事务里面的一系列操做要么全作,要么全不作,事务是不可分割的一个总体。sql
一致性(Consistency) :事务开始前和结束后,数据库的完整性约束没有被破坏。一个事务的中间状态对外部不可见。好比,A向B转帐,不可能出现A扣了钱,B却没有收到的状况。数据库
隔离性(Isolation) :同一时间只容许一个事物访问同一个数据,不一样的事务之间彼此没有任何干扰。session
持久性(Durability) :事务完成后,事务对数据库的全部更新将被保存到数据库,不能回滚。并发
注:原子性是事务隔离的基础,隔离性和持久性是手段,最终目的是为了保持数据的一致性。spa
脏读 :事务A读取了事务B更新的数据,而后事务B回滚了,那么事务A读取的数据是脏数据。code
不可重复读 :事务A读取数据d1,事务B对数据d1进行更新操做而且提交了事务B,事务A再次读取数据d1,那么事务A第一次和第二次读取的数据不一致。blog
幻读 :事务A查询id=1的数据,发现没有,事务b插入了id=1的数据而且提交了事务B,事务A插入id=1的数据报错,这个时候事务A就产生了幻读。事务
读未提交(read-uncommitted) :不能够防止任何的事务并发问题,可是执行效率最高。ci
读已提交(read-committed) :可防止脏读,效率低于读未提交。
可重复读(repeatable-read) :可防止脏读、不可重复读,效率低于读已提交。(注:mysql默认事务隔离级别)
串行化(serializable) :可防止脏读、不可重复读、幻读,效率最低。
查看数据库隔离级别:
select @@tx_isolation;
设置当前会话的事务隔离级别:
set session transaction isolation level read uncommitted;
设置全局的事务隔离级别
set global transaction isolation level repeatable read;