MySQL事务
1,事务的四大特性
四大特性即:
- 原子性:一组操作封装为一个执行单元,该组操作指令只能同时成功或者同时失败。
- 一致性:事务执行前后数据的状态和合法性是一致的。
- 隔离性:事务之间具有隔离性,根据隔离级别确定影响的大小。
- 持久性:事务执行完毕后,数据会被永久改变,持久化到磁盘上。
2,事务的隔离级别
事务之间的执行具有四种影响的现象,由低到高依次排列为:
- 脏写:事务a修改了事务b修改了但未提交的数值,事务a回滚,导致事务b写入的数值丢失。
- 脏读:读取到别的事务写入的临时数据,事务回滚了,数值丢失。
- 不可重复读:读取到的数据被其他事务修改了,再次读取时数据不一致。
- 幻读:事务读取到了其他事务提交的临时数据,下次再次读取时,事务回滚了,之前读取的数据不存在了。
MySQL对此的解决方案,设置隔离级别,分别为:
隔离级别 | 解决问题 | 锁 |
---|---|---|
读未提交(READ UNCOMMITTED) | +=脏写 | 否 |
读已提交(READ COMMITTED) | +=脏读 | 否 |
可重复读(REPEATABLE READ) | +=不可重复读取 | 否 |
序列化(SERIALIZABLE) | +=幻读 | 是 |
MySQL默认的事务隔离级别为不可重复读。
手动设置隔离级别
SET [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL 隔离级别;
#其中,隔离级别格式:
> READ UNCOMMITTED
> READ COMMITTED
> REPEATABLE READ
> SERIALIZABLE
或者
SET [GLOBAL|SESSION] TRANSACTION_ISOLATION = '隔离级别'
#其中,隔离级别格式:
> READ-UNCOMMITTED
> READ-COMMITTED
> REPEATABLE-READ
> SERIALIZABLE