MySQL 事务详解

目录

什么是事务

事务的使用

事务的特性

事务的异常

脏读

不可重复读

幻读

MySQL的四个隔离级别


什么是事务

在数据库中,事务的本质就是把多条SQL语句打包成一个整体,要么全都执行,要么全都不执行

通过实际业务理解事务:

在实际生活中我们的转账操作涉及到两步,比如小王给小李转账五百

1.小王的账户金额 减500

2.小李的账户金额 加500

这两步操作中,如果小王转账后,恰好数据库崩溃了,导致小李没有到账,这种情况就很麻烦

因此我们要将这两条SQL语句打包为一个整体,要么都执行 小王-500 小李+500,要么两者都不执行 这样双方都不会有损失

这样的打包操作就称为 事务

将俩操作打包为一个事务后,如果第一个SQL执行完系统崩溃了,下次数据库启动后会自动把上次修改一般的数据还原.(给小王加回500) 数据库通过 回滚 (rollback)操作进行还原

数据库会有个专门记录事务操作步骤的日志,会额外占用硬盘空间,因此使用事务的时候,执行SQL语句的开销是更大,效率是更低的

事务的使用

1 )开启事务: start transaction;
2 )执行多条 SQL 语句
3 )回滚或提交: rollback/commit;
说明: rollback 即是全部失败, commit 即是全部成功。
start transaction;
-- 阿里巴巴账户减少 2000
update accout set money=money- 2000 where name = ' 阿里巴巴 ' ;
-- 四十大盗账户增加 2000
update accout set money=money+ 2000 where name = ' 四十大盗 ' ;
commit;

事务的特性

1.原子性

原子性是事务的核心特性

将多个SQL操作打包成一个整体,要么都一起执行,要么都不执行,没有中间状态

2.一致性

事务执行前后的数据应该是一致的,即使发生异常,也不会因为异常而破坏数据的完整性约束

比如小王有一千块,给小李转账五百,那么执行后应该是小王五百,小李五百.

不能是小李五百,小王还是有一千块

3.持久性

事务执行的各种操作都是持久生效的,事务执行完毕后会将修改后的数据重新写入到硬盘中

即使程序重启/主机重启/掉电, 事务都可以正常工作, 保证修改是生效的.

4.隔离性(重点)

隔离性是指数据库同时执行多个事务的时候,不同事务之间的相互影响程度

一个服务器, 可以同时给多个客户端提供服务, 这多个客户端是并发执行的关系, 多个客户端就会有多个事务, 多个事务同时去操作一个表的时候, 特别容易出现互相影响的问题.

并发执行事务的时候,隔离性会在 数据可靠 与 执行效率 之间做出权衡

隔离性越高,并发性越低,数据越可靠,数据库性能越低

隔离性越低,并发性越高,数据越不可靠,数据库性能越高

事务的异常

脏读

事务1在进行写操作 输入数据的时候,事务2去读取了表中的数据,但有可能此时的数据只是临时存在的 或者 想要的数据还没写入  ,并不是最终的结果.  这样的数据就称为 脏数据. 这样的读操作就是 '脏读' 问题

解决方法:

给写操作加锁,事务1在写操作时,事务2不能进行读操作,事务1写完数据后事务2再去读取的数据,就是事务1的最终数据了

给写操作加锁,事务的并发性降低了 (处理效率降低了),事务的隔离性提高了 (数据的准确性提高了)

不可重复读

事务1已结提交了数据,此时事务2开始去读取数据,而在读取过程中,事务3又再次提交了新的数据,导致同一个事务2里,多次读取的数据是不一样的  (预期在同一个事务中,读取的结果应该是一致的),这就是 '不可重复读' 问题

解决方法:

给读操作加锁,在进行读操作时,别的事务就不能再进行写操作了

给读操作加锁,事务的并发处理能力降低了 (处理效率降低了),事务的隔离性提高了 (数据的准确性提高了)

幻读

MySQL的四个隔离级别

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL事务隔离级别决定了在并发环境下多个事务之间的隔离程度。MySQL提供了四个事务隔离级别,分别是读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。以下是对这四个隔离级别的详细解释: 1. 读未提交(Read Uncommitted):这是最低级别的隔离级别。在该级别下,一个事务可以看到其他事务未提交的修改。这可能导致脏读(Dirty Read)和不可重复读(Non Repeatable Read)的问题。 2. 读已提交(Read Committed):在该级别下,一个事务只能看到其他事务已经提交的修改。这可以避免脏读的问题,但仍可能导致不可重复读的问题。 3. 可重复读(Repeatable Read):在该级别下,一个事务在执行期间能够看到同一结果集的一致性快照。这可以避免脏读和不可重复读的问题,但仍可能导致幻读(Phantom Read)的问题。 4. 串行化(Serializable):在该级别下,事务之间是完全隔离的,每个事务必须按照顺序执行。这可以避免脏读、不可重复读和幻读的问题,但也会导致并发性能的严重下降。 要查看MySQL的默认隔离级别和当前会话的隔离级别,可以使用以下命令: ```sql SELECT @@GLOBAL.tx_isolation, @@tx_isolation; ``` 请注意,MySQL 8之前可以使用上述命令,而MySQL 8及更高版本可以使用以下命令: ```sql SELECT @@global.transaction_isolation, @@transaction_isolation; ``` 这样可以查看默认的全局隔离级别和当前会话的隔离级别。这些隔离级别可以通过设置`transaction_isolation`参数来进行更改。<span class="em">1</span><span class="em">2</span><span class="em">3</span>

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值