事务
事务就是把系统状态从一种一致性点转换到另一个一致性点。事务主要包含acid四个特性:
- a(原子性)
在一个事务中,要么修改全部成功,要么全部不成功;由undolog保证 - c(一致性)
系统状态从一种一致性转换到另一种一致性,例如银行转账,转帐前a账户1000元b账户1000元,a转给b500元,结果必须是a:500 b:1500,即转帐前后两个账户总额不变 - i (隔离性)
对于不同事务之间数据可见性的隔离,mysql有四个级别:read uncommited(读未提交)、read committed(读已提交)、repeatable read(可重复读)、serilizable(串行化)
由lock或者mvcc(多版本)保证 - d(持久性)
一旦事务提交,数据就已经保存在磁盘中,只要磁盘不损坏无论mysql或者服务器发生什么情况都能恢复;由redolog保证
事务操作语句
begin|start transaction 开启一个事务,在存储过程中只能用start transaction,因为begin会被识别为begin...end...
commit 提交事务
rollback 会滚整个事务
savePoint name 创建一个保存点
rollback to name 回滚到给定名称的保存点
set transaction 设置隔离级别,分为当前会话或者全局,全局只对修改后创建的会话生效已存在的会话不会发生改变
set [ global | session ] transaction isolation level Read uncommitted | Read committed | Repeatable | Serializable;
隔离级别
隔离级别越高越能数据隔离性越好,但是效率会降低,并且不同隔离级别会出现不同的问题,如下表所示:
| 隔离级别 | 异常情况 | 异常情况 | 异常情况 |
|---|---|---|---|
| 读未提交 | 脏读 | 不可重复读 | 幻读 |
| 读已提交 | 不可重复读 | 幻读 | |
| 可重复读 | 幻读 | ||
| 序列化 |
脏读:读取到另一个事务还未提交的数据
不可重复读:在同一个事务中同一条数据结果不一致(数据被其他事务修改)
幻读:一个事务中可以修改另一个事务已提交的新增数据但是不能查询到,在rr级别可以通过加锁避免幻读

浙公网安备 33010602011771号