事务一般包含三个操作:启动、提交、回滚具体语法是:
启动:start transaction; 或 begin;
提交:commit; //不提交的话别人查询不到添加的数据
回滚:rollback; //一键还原
只有当前数据库的引擎为Innodb才支持事务,其他类型不支持。
begin;
insert into student values(1,"小三");
commit;
begin;
insert into student values(1,"小四");
rollback;
事务会一般会产生几种并发问题:
1、脏读: 读到了没有提交的数据
2、不可重复读:读取同一个数据时候,结果不一致
3、幻读:重复查询的过程中数据发生了量的变化
不可重复读与幻读的区别在于:不可重复读,主要在于数据内容上有区别(重质),幻读在与查询数据的数量上不同(重量)。
事务拥有ACID四大特性:
1、Atomicity 原子性
事务的原子性,类似于化学中的原子,是基本单位。表现了事务是一个不可以分割的整体。具体的现象应该为要么全部做完,要么全部不做,不可能只做一半。当事务中的sql出现错误的时候,所有的操作就会回滚到事务开始之前的状态。
2、Consistency 一致性
事务的一致性,一般指事务的执行不能破坏数据库的完整性和一致性,一个事务在执行前后,数据库都应该处于一个一致性的状态。比如:当A给B转前,A的余额少了,B余额却没增加。
3、Isolation 隔离性
事务的隔离性表现在并发的环境中,两个不同的事务同时进行,他们应该是相互隔离的,互不影响的。每个事务都应该有他们完整的数据空间。
4、Duration 持久性
事务的持久性指数据一旦提交后,数据库的数据必须被永久保存。 只要数据库重启,一定会恢复到数据提交完事务之后的状态。
Isolation 事务的隔离性有四个隔离级别:
事务隔离级别 | 脏 读 | 不可重复读 | 幻 读 |
读未提交(read_uncommitted) | 允许 | 允许 | 允许 |
读已提交(read_committed) | 禁止 | 允许 | 允许 |
可重复读(repeatable_read) | 禁止 | 禁止 | 可能会 |
顺序读(serializable) | 禁止 | 禁止 | 禁止 |
4种隔离级别从上向下,级别越高,并发性越差,安全性越高。一般数据默认级别是读以提交或可重复读。
查询当前会话的隔离级别:mysql8之后是 select @@transaction_isolation
或者select @@tx_isolation
设置当前会话中的事务隔离级别:
set session transaction isplation level 需要设置的隔离级别
事务隔离级别实现的原因是因为不同的隔离别会有不同的锁:
1. 读未提交(RU): 有行级的锁,没有间隙锁。它与RC的区别是能够查询到未提交的数据。
2. 读已提交(RC):有行级的锁,没有间隙锁,读不到没有提交的数据。
3. 可重复读(RR):有行级的锁,也有间隙锁,每次读取的数据都是一样的,并且没有幻读的情况。
4. 序列化(S):有行级锁,也有间隙锁,读表的时候,就已经上锁了