事务必知必会
事务由一组数据操纵语句(DML)组成,这组语句要么全部成功,要么全部失败
事务操作
开启事务
start transaction;
设置保存点
savepoint 保存点名;
回退到某个保存点
rollback to 保存点名;
注:回退到某个保存点时,在这个保存点之后进行的操作全部都会删除
回退到事务开始时状态
rollback;
提交事务
commit;
注:一旦提交事务,所有操作生效,锁释放,前面设置的保存点会全部删除,不能回退。此时其他会话就可以看到变化后的新数据。
事务隔离级别
不考虑隔离会引发的问题:
- 脏读(dirty read):一个事务看到另一个事务还没提交的数据变化
- 不可重复读(nonrepeatable read):同一查询操作在一次事务中多次进行,由于其他事务提交的修改和删除操作会让数据变化,此时每次查询到的数据就会不同
例子:第一次查询余额账户时是100,然后有人往这个账户里转了50并且提交了事务,然后我第二次查询余额是150,与第一次不同。 - 幻读(phantom read):同一查询操作在一次事务中多次进行,由于其他事务提交的插入操作会让数据变化,此时每次查询到的数据就会不同
注:有的人会觉得其他事务提交后,我的事务能够查询到数据变化是正常的,为什么会不可重复读和幻读呢?但实际上我开启一个事务,就是希望我看到的数据就是我连接数据库时表内的数据,只要我还没提交事务,我能读到数据就不应该产生变化。
隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 | 是否加锁读 |
---|---|---|---|---|
读未提交(read uncommitted) | 不加 | |||
读已提交(read committed) | 解决 | 不加 | ||
可重复读(repeatable read) | 解决 | 解决 | 一般可以解决 | 不加 |
可串行化(serializable) | 解决 | 解决 | 解决 | 不加 |
查看当前会话隔离级别
select @@transaction_isolation;
查看系统当前隔离级别
select @@global.transaction_isolation;
设置当前会话隔离级别
set session transaction isolation level 隔离级别;
设置系统隔离级别
set global transaction isolation level 隔离级别;
MySQL默认隔离级别是可重复读
ACID特性
- 原子性(atomicity):事务不可分割,要么都成功,要么都失败
- 一致性(consistency):使数据库从一个一致性状态到另一个一致性状态
- 隔离性(isolation):一个事务不能被其他事务的操作干扰
- 持久性(durability):事务提交,数据永久性改变
小贴士:MySQL的事务机制需要InnoDB存储引擎才可以使用
标签:事务,隔离,必知,isolation,MySQL,read,提交,必会,级别 From: https://www.cnblogs.com/ivanchenyx/p/16978515.html