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

MySQL事务

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

MySQL事务

事务的基本要素:acid

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

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

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

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

事务的并发问题:

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

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

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

小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

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

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

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

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

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

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

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

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

串行化:都不会导致