MySQL事务
MySQL事务
什么是事务
- 事务用于保证数据的一致性,它由一组相关的dml操作语句组成,该组的dml语句要么全部成功要么全部失败。
事务和锁
- 当执行事务操作时(dml语句),mysql会在表上加锁,防止其它用户该表的数据。
# 事务操作
// 1.start transaction -- 开始一个事务
// 2.savepoint 保存点名 --设置保存点
// 3.rollback to 保存点名 -- 回退事务
// 4.rollback --回退全部事务
// 5.commit -- 提交事务,所有的操作生效,不能回退
事务细节
- 如果不开启事务,默认情况下,dml自动提交,不能回滚
- 如果开始一个事务,你没有创建保存点,你可以执行rollback,默认就是回退到开启事务的时候
- 开启一个事务后,在提交前可以创建多个保存点,并在提交前可以回退到任意保存点的位置
- mysql的事务需要innodb,myisam不好使
- 开启一个事务 start transaction 或者 set autocommit = off
MySQL事务隔离级别
-
多个连接开启各自事务操作数据库中的数据时,数据库系统要负责隔离操作,以保证各个连接在获取数据时的准确性。
-
如果不考虑隔离性,可能出现以下几个问题:
-
- 脏读:当一个事务读取另一个事务尚未提交的修改时,产生脏读
- 不可重复读:同一查询在同一事务中多次进行,由于其它提交事务所做的修改,会造成每次返回不同的结果,此时发生不可重复读。
- 幻读:同一查询在同一事务中多次进行,由于其它提交事务所做的插入和删除操作,每次返回不同结果集,出现幻读。
MySQL隔离级别 | 脏读 | 不可重复读 | 幻读 | 加锁读 |
---|---|---|---|---|
读未提交(Read uncommitted) | √ | √ | √ | 不加锁 |
读已提交(Read committed) | × | √ | √ | 不加锁 |
可重复读(Repeatable read) | × | × | × | 不加锁 |
可串行化(Serializable) | × | × | × | 加锁 |
- 设置隔离
# 设置隔离
// MySQL8中
-- 查看当前会话隔离级别
select @@transaction_isolation;
-- 查看系统当前隔离级别
select @@global.transaction_isolation;
-- 设置当前会话的隔离级别
set session transaction isolation level [隔离级别]
-- 设置当前系统的隔离级别
set global transaction isolation level [隔离级别]
MySQL事务ACID
- 原子性:数据库的事务是不可分割的工作单位,在同一个事务里的操作要么全部成功要么全部失败。
- 一致性:事务必须从一个一致性转到另一个一致性。
- 隔离性:对于多个用户同时操作数据库,数据库为每个用户开启一个事务,防止他们之间相互干扰。多个并发事务之间要相互隔离。
转到另一个一致性。 - 隔离性:对于多个用户同时操作数据库,数据库为每个用户开启一个事务,防止他们之间相互干扰。多个并发事务之间要相互隔离。
- 持久性:持久性是指一个事务一旦被提交,它对数据库中的数据的改变就是永久的,接下来即使数据库发生故障也不应该由任何影响。