mysql事务浅谈

一、事务定义

  • 事务:事务是一个最小的不可在分的工作单元;通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务是一个最小的工作单元)
  • 一个完整的业务需要批量的DML(insert、update、delete)语句共同联合完成。
  • 事务只和DML语句有关,或者说DML语句才有事务。这个和业务逻辑有关,业务逻辑不同,DML语句的个数不同。
  • 开启事务:Start Transaction
  • 事务结束:End Transaction
  • 事务提交: Commit Transaction
  • 事务回滚: Rollback Transaction

1.为什么要设置事务:保证多条sql要么同时成功,要么同时失败。

2.一个事务理解的小例子:

转账业务:

分为非事务和事务两种情况

二、事务的四大特性(ACID,分别是原子性、一致性、持久性、隔离性)

1.原子性:指一个事物是一个不可分割的工作单位,其中的操作要么都成功,要么都失败.

1.1 undo log日志

undo log是mysql中比较重要的事务日志之一,顾名思义,undo log是一种用于撤销回退的日志,

在事务没提交之前,MySQL会先记录更新前的数据到 undo log日志文件里面,

当事务回滚时或者数据库崩溃时,可以利用 undo log来进行回退(事务回滚:rollback)。

2.持久性: 指事务一旦提交,它对数据库的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

2.1如何保证故障不会影响持久性的:

利用了缓存池(Buffer Pool)来刷脏(缓冲池再定期刷新到磁盘中)。事务提交不是直接提交到磁盘了,而是先提交到缓存池里面,再定期刷脏到磁盘中。

如果电脑出现了故障,通过重做日志(redo log)恢复数据

3.隔离性:事务内部的操作与其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

4.一致性:指事务执行结束后,数据库的完整性约束没有被破坏,例如转账之前总金额1000,转账之后,总金额没变化。

前面的原子性、隔离性和持久性都是为了保证数据库的一致性。

三、事务的并发问题

1.脏读:事务A读到了事务B修改但是没有提交的数据;

左边事务读到了右边事务没有提交的数据。

2.不可重复读:事务A查询同一条语句的前后结果不一样(B事务提交前后结果)。

对于左边事务,读取的两次数据不一样,原因是事务B进行了修改。

3.幻读:每个事务都处于自己的世界,不受别的事务影响,就像有幻觉一样

左边事务一直进行查询结果都一样,但是右边事务做了很多的修改操作,左边事务却处于自己的世界,不受任何影响。

四、事务的隔离级别

1.读未提交: read uncommitted ---隔离级别最低,什么并发问题都解决不了

set global transaction isolation level read uncommitted; #查看当前隔离级别 select @@global.tx_isolation,@@tx_isolation;

会产生脏读:事务A会读到B未提交的数据

2.读已提交: read committed ---可以解决脏读的问题,但是会出现不可重复读的问题

set global transaction isolation level read committed; 查看当前隔离级别 select @@global.tx_isolation,@@tx_isolation;

会产生不可重复读:事务A多次查询到的结果不一致(B事务前后提交前后)

3.可重复读:repeatable read --可以解决不可重复读,但是可能会导致幻读

set global transaction isolation level repeatable read; 查看当前隔离级别 select @@global.tx_isolation,@@tx_isolation;

mysql的默认隔离级别

会产生幻读:A事务和B事务都沉浸在自己的操作中,无法出来(在自己的事务环境中,别的事务改变自己不会收到任何影响)

4.串行化:serializable---解决了上面所有的问题---让事务一个一个执行

set global transaction isolation level serializable; 查看当前隔离级别 select @@global.tx_isolation,@@tx_isolation;

缺点:吞吐量太小,隔离级别太高,降低了效率

5.隔离级别和一致性的关系图:

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL的存储引擎是插件式的,其中最常用的两个存储引擎是MyISAM和InnoDB。MyISAM是MySQL中默认的存储引擎,它没有太多人关注的原因可能是因为它在一些方面的性能和功能上相对较弱。然而,决定使用哪个存储引擎是一个复杂的问题,而我们可以聚焦于MyISAM和InnoDB这两个最常见的存储引擎。 在这两个存储引擎中,InnoDB要求表必须有主键,因为它的数据文件本身按照主键聚集。而MyISAM可以没有主键。这是InnoDB与MyISAM之间的一个重要区别。 因此,当选择MySQL的存储引擎时,我们需要考虑不同存储引擎的特性和适用场景,以便根据需求选择最合适的存储引擎。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [浅谈MySQL存储引擎](https://blog.csdn.net/hanfeng529264/article/details/123352215)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [浅谈MySQL存储引擎选择 InnoDB与MyISAM的优缺点分析](https://download.csdn.net/download/weixin_38655484/12834006)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值