mysql学习之旅06-事务
概念:
- 事务是为了完成某一项工作或业务的一组步骤的集合
- 事务是一个完整的整体,不能拆分开
- 事务在数据库中的表现就是一组sql语句完成某个业务
特新(ACID):
- 原子性(Atomicity): 事务是一个整体,不能分割
- 一致性(Consistency): 事务执行的结果只有两种,全部成功或者全部失败。不存在部分成功或部分失败的情况
- 隔离性(Isolation): 各个事务之间相互隔离,互不影响
- 持久性(Durability): 事务执行的结果可以永久保存到数据库或文件中。任何时候都可以查询事务执行的 结果。
使用:
- mysql默认事务是自动提交的
- 查看事务自动提交的状态
select @@AUTOCOMMIT
或者
SHOW SESSION VARIABLES LIKE 'AUTOCOMMIT'
- 可以设置事务提交的模式
SET AUTOCOMMIT = 0; 关闭
SET AUTOCOMMIT = 1; 开启
### 设置关闭后需要手动提交事务COMMIT,或者回滚事务ROLLBACK
- 事务使用方式
- 开启事务:START TRANSACTION; 或者BEGIN;
- 提交事务:COMMIT;事务成功,事务的处理结果永久保存到数据库
- 回滚事务:ROLLBACK;事务失败,回滚到事务开始之前的状态,注意自动增长不会回滚
- 事务只针对数据库中表的变动,不针对查询
隔离级别的安全问题
- 读问题:脏读,不可重复读,幻读
- 写问题:丢失更新(悲观锁,乐观锁)
四种隔离级别:
级别 | 含义 | 备注 |
---|
READ UNCOMMITTED | 读未提交 | 会出现脏读:一个事务读到了另一个事务未提交的数据 |
READ COMMITTED | 读已提交 | 会出现不可重复读:一个事务的数据修改未提交,另一个事务无法进行数据修改操作,在一个事务修改提交之后,另一个事务在它提交前查询和提交后查询结果是不一样的,所以不可重复读取统一数据 |
REPEATABLE READ | 可重复读(mysql) | 会出现幻读现象:A事务在B事务提交修改之前做了查询,在B事务提交之后,A事务再次查询结果和之前查的结果一样, 并没有查询到B事务提交后的数据 |
Serializable | 可串行化 | |
查看隔离级别
SELECT @@tx_isolation
设置隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL read uncommitted
sql实操:
//查看事务自动提交是否开启(1开启,0关闭)
select @@autocommit;
//设置手动提交
set @@autocommit = 0;
//开启一个事务
start transaction;
begin;
//提交事务
commit;
//回滚事务
rollback;