学习mysql 的事务

闲着无事,想写一篇完整的关于mysql事务知识点,不会很深入,但是把mysql事务知识完整的串起来了,之前学习没找到一篇完整的,总是发现新的不知道,这篇应该还有更新,目前事务我了解到的知识点已经完整的串起来了。
首先,事务不用介绍了吧,事务的几个特性,大家应该都清楚。但是事务的隔离性,在并发时会产生几个问题可能都知道一点,就是脏读、不可重复读、幻读,注意是并发的情况会产生这三个问题,
脏读:就是别人还没走完事务,只是要修改,你就读取了,万一它反悔了呢,不想修改了。你读取的不就是错误数据
不可重复读:在一次事务当中,每次读取同一条数据,读取的总是不同。这是为啥?是因为别人总在改数据,你就读取的不同了。
幻读:第一次查询数据有3条,第二次查询就5条了,这是幻觉吗?这别人插入了一条数据。这就是幻读,
因此呢,针对上述情况,数据库就产生了隔离等级。隔离等级有四个,由低到高分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable 。这个四个等级分别解决什么问题,大家可以网上找一篇看看。
了解这四个隔离等级后,我说下常见数据库使用的那个等级,一般大多数使用的Read committed比如:orcal、sql sever等。
而我们mysql却用的repeatable read,似乎是因为主从复制的有bug所以改成用这个等级了。这个等级一般情况下是用for update来解决隔离性问题。但是这样会降低性能,尤其是一些情况下会从锁行变成锁表,所以mysql的大佬们就不乐意了,我这性能变低了啊。于是mysql的mvcc(多并发版本控制)机制诞生了,它解决了读的同时还可以写,详细原理,门:mvcc详解
看完这个可能还有点懵,再次传送门mvcc快照读、当前读举例子说明 再看完这个博客,应该就明白了快照读吧,也明白了mysql是如何解决可重复的读,白话讲就是读取时生成ReadView,所以在这次事务中,每次读取都是一样的数据,这样就解决了不可重复读了。
按我理解mysql这个解决方法,没有解决当我读取后,别人不能修改这个数据的问题。也就是以下场景:小李在商城付款买个ps5,与此同时小李老婆买了个包,蹩脚开发代码这样写的先查询卡上余额够不够,如果够算出新的余额,再更新余额。原本包和ps5一起的钱,小李的余额是不够的,但是因为查询时没有锁住,造成了两个都买了,最后余额变成了买完包的钱。
所以我们在使用mysql时,多次读取要保证数据一致,还是需要使用锁的。

我就是这样阅读的顺序,明白了mysql的re peatable read是怎样的。
请大家多多指教,时不时更上班遇到的问题
MySQL事务是一组关联的SQL操作,它们被看作是一个整体,要么全部执行成功,要么全部回滚。事务具有四个ACID属性:原子性、一致性、隔离性和持久性。 首先,原子性意味着事务中的所有操作要么全部成功执行,要么全部回滚。如果事务中的一个操作发生错误,会导致整个事务回滚到之前的状态。 其次,一致性表示事务执行完毕后,数据库将会进入一个有效的状态。在事务开始之前和结束之后,数据库的完整性约束必须得到保持,确保数据的正确性。 隔离性是指每个事务的操作在执行过程中是相互隔离的,不会互相干扰。事务并发执行时可能会出现的问题包括脏读、不可重复读和幻读。为了解决这些问题,数据库系统提供了四个隔离级别:未提交读取、已提交读取、可重复读取和串行化。 最后,持久性是指一旦事务被提交,对数据库的修改将会永久保存,即使在系统故障的情况下也是如此。数据库系统通过将事务的日志记录到磁盘上来实现持久性。 在MySQL中,可以使用START TRANSACTION语句来开始一个事务,COMMIT语句来提交一个事务,ROLLBACK语句来回滚一个事务。此外,可以使用事务控制语句来设置隔离级别,如SET TRANSACTION ISOLATION LEVEL。要保证事务的正确性和性能,还应注意事务的边界,避免事务嵌套过深。 深入学习MySQL事务需要理解事务的四个ACID属性以及MySQL事务控制语句。此外,还需要了解事务的隔离级别,以便在并发执行的情况下避免数据不一致的问题。掌握MySQL事务的概念和操作方法,可以保证数据库操作的一致性和可靠性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值