首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我的钱呢?MySql事务

假设一个情景:比如你现在给你女朋友转了520元,按理说,你的账户余额会减少520元,而你的女朋友的账户余额会增加520元,这两种操作本是捆在一起一次性完成的。

可中途打雷服务器崩溃了,那你可以想想,你的钱现在到底在哪。

"事务"就出现了,事务内的操作,要么全部执行成功,要么全部执行失败。

事务是一系列原子性的SQL查询。之所以事务很强大,它得具备以下几个标准。

ACID

原子性(Atomicity):

在一个事务中的操作,不允许分割,它们是一个整体,要么全部提交成功,要么全部失败回滚。

一致性(Consistency):

数据库总是从一个一致性的状态转换到另一个一致性的状态。你和你女朋友的账户总金额在转账前后必须一致。

隔离性(Isolation):

一个事务所做的修改在没有提交之前,其它事务是看不到的。你给你女朋友转账的同时,你大哥也同时向你转钱,这样一致性无法保证,所以你给你女朋友转账的同时,其他事务无法修改相关数据。

持久性(Durability):

事务一旦提交,则所做的所有操作就会永久保存在数据库中,不会丢失。

事务开启和结束

事务开启是由begin、start transaction 或关闭自动提交(set autocommit=0),MySql 默认是自提交的(set autocommit=1)

事务结束是由 commit(提交)或rollback(回滚)

扩展注意:

truncate 在事务中不能被回滚。

隔离级别

如果我们同时执行多个事务,比如你在给女朋友汇款(此刻你的操作显示减去了520,但你女朋友的账户还未更新520元),整个过程还没有提交的同时,你又向另一个人汇款,那此时你的账户余额到底看到的是减去520元后的余额还是压根还是刚开始的余额?

这就引发了一些问题,比如 脏读(dirty read)、不可重复读(nonreapeatable read)、幻读(phantom read),所以我们需要一些限制或级别,来隔离可见或不可见,这就有了“隔离级别”的概念。

读未提交(read uncommitted):

一个事务还没提交,它做的修改就能被别的事务看到。

读提交(read committed):

一个事务提交之后,它做的修改才会被其他事务看到。

可重复读(repeatable read):

一个事务执行过程中查询到的数据,总是跟这个事务在启动时看到的数据是一致的。

串行化 (serializable):

通过事务强制串行执行。它会在读取的每一行数据加锁。

可重复读是MySQL默认的隔离级别。

几个注意点:

脏读:

一个事务读到了其他事务还没有提交的数据。比如你在第一个事务中,修改了其中的数据,但是你还没有提交,另一个事务此刻访问这些数据,结果他访问到了你修改后的数据,之所以是"脏的",是因为我可以在第一事务中选择回滚,而对于第二个事务,读到的数据就是脏的,不准确的。

不可重复读:

一个事务读取到了其他事务对以前的数据修改过后的记录。比如你在第一个事务中,用相同条件多次访问同一个数据,此刻你还没有结束事务,而第二个事务恰好了修改了同一个数据里的数据,当你再用相同条件去访问时,发现第一个事务中读到的数据前后不一致了。一句话来说,不能读到相同的数据内容。

幻读:

一个事物读取到了其他事务 新增的数据,感觉出现了幻影现象。比如你在一个事务中修改了所有的数据,同时,第二个事务也修改这个表中的数据,它向表中插入一行新数据。那么,当你操作第一个事务时发现怎么还有没有被修改的数据行(就是那个新增的数据,多了一条),就好像看到了幻影一样。

注意:

不可重读的重点在于修改,我前后看到的数据值不一样。

幻读重点是新增或删除,我前后读到的记录数不一样。

觉得本文对你有帮助?请

分享给更多人

关注「阿T同学」

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190114G120QA00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券