您现在的位置是:网站首页 > 心得笔记

MySQL事务

盛悦2022-05-124096人围观
简介不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

MySQL事务

事务的定义:

事务是一系列数据库操作的集合,这些操作要么全部成功,要么全部失败。

事务的基本要素:acid

原子性:事务开始后的所有操作,要么全部成功,要么全部失败

隔离性:同一时间只允许一个事务操作同一数据

一致性:事务开始前和结束后,数据库的完整性没有被破坏,比如A向B转钱,不可能A扣了B没收到

持久性:事务完成后,事务对数据库的所有更新都保存再数据库中,不可回滚


事务的基本操作:

  • 开启事务:START TRANSACTION;

  • 提交事务:COMMIT;

  • 回滚事务:ROLLBACK;


事务的隔离级别(默认可重复读)

事务的隔离级别决定了事务之间的相互影响程度,MySQL支持以下四种隔离级别:

  • 读未提交:事务未提交之前所作的变更就能被其他事务看到(又称为脏读);

  • 提已提交:事务提交之后所作的变更才能被其他事务看到(不可重复读);

  • 可重复读:事务提交之后所作的变更才能被其他事务看到(幻读);

  • 串行化:对于同一行数据,写会加写锁,读会加读锁,当出现读写冲突时,后访问的事务必须等前一个事务完成后才能继续执行;


四种隔离级别的分析

  • 读未提交:事务A正在查询数据,这时事务B把这条数据更改了,这时事务A查到的就是更改后的数据,由于某种原因事务B回滚了,事务A读取的就是脏数据。导致脏读、不可重复读、幻读;

  • 提已提交:事务A正在查询数据,这时事务B把这条数据更改并提交了,那事务A在查询的结果就与之前不一致了,也就是不可重复读。导致不可重复读、幻读;

  • 可重复读:事务A查询数据,事务B新增一条数据,事务A没查出新增数据。导致幻读;

  • 串行化:都不会导致;


事务的并发问题:

  • 脏读:事务A读取了事务B更新的数据,然后事务B回滚操作,那么A读取到的数据就是脏数据

  • 不可重复读:事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据做了更新并提交,导致事务A多次读取同一数据的结果不一致。

  • 幻读:系统管理员将数据库中所有学生的成绩从具体分数改为ABCD四个等级,但是就在这时系统管理员B插入了一条具体分数的记录,当系统管理员A改结束后,发现还有一条记录没改过来,就像发生幻觉一样。这就叫幻读。


注意:

  • 不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。

  • 解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表