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
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值