什么是事务?
一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。
事务的ACID特征:
原子性(Atomicity):是不可分割的最小操作单位,要么同时成功,要么同时失败
一致性(Consistency):保证数据的状态操作前和操作后保持一致
隔离性(Isolation):多个事务同时操作相同数据库的同一个数据时,一个事务的执行不受另外一个事务的干扰
持久性(Durability):当事务提交或回滚后,数据库会持久化的保存数据
事务操作步骤
1. 开启事务
2. 编写事务逻辑操作单元
3. 提交事务或回滚事务
事务分为隐性事务和显性事务
隐式事务:没有明显的开启和结束事务的标志
* insert、update、delete语句本身就是一个事务显式事务:具有明显的开启和结束事务的标志
1. 取消自动提交事务:set autocommit=0;
2. 开启事务:start transaction;
3. 提交或回滚事务:
- commit;
- rollback;那么开启一个事务的步骤如下:
步骤
步骤1:开启事务
set autocommit=0; //设置自动提交功能为禁用。(针对当前事务语句)
start transaction;(可选)
步骤2:编写事务中的sql语句(增删改查:select、insert、update、delete)
语句1; 语句2; 语句3;......
步骤3:结束事务
commit:提交事务
rollback:回滚事务
事务的隔离级别
- 事务并发问题是如何产生的?
- 当多个事务同时操作同一个数据库的相同数据时
- 事务并发问题
- 脏读:一个事务读取到了另外一个事务未提交的数据
- 不可重复读:同一个事务中,多次读取到的数据不一致
- 幻读:一个事务读取数据时,另外一个事务进行更新,导致第一个事务读取到了没有更新的数据
- 处理事务并发问题,设置事务隔离级别
- READ UNCOMMITTED
- READ COMMITTED:可以避免脏读
- REPEATABLE READ:可以避免脏读、不可重复读和一部分幻读
- SERIALIZABLE:可以避免脏读、不可重复读和幻读
注意:隔离级别从小到大安全性越来越高,但是效率越来越低
- 设置隔离级别
- set session|global transaction isolation level 隔离级别名;
- 查看隔离级别
- select @@tx_isolation;
savepoint保存节点
Set autocommit=0;
Start transaction;
Delete from 表名 where id=10;
Savepoint a;#设置保存点
Delete from 表名 where id=18;
Rollback to a;#回滚到保存点输出结果,删除语句18还存在,但10被删除了。