mysql事务

上文我们提到了数据库异常重启以及数据备份的数据一致性问题。其中提到mysql的解决方案就是两阶段提交。
如果昨天我们讲的是数据的物理一致性,那么今天我们要探讨的问题是数据的逻辑一致性。
事务,什么是事务?事务是一组操作,这一组操作看起来像是一个操作一样,全部成功或者全部失败。举例说明:银行转账业务:a账户减少->b账户增加。
mysql的事务是在引擎层实现的。myisan不支持事务。
事务的四个特点,ACID。
事务和线程:
问题:脏读,不可重复读,幻读,。
sql的事务隔离级别:读未提交,读提交,可重复读,串行化
读未提交:顾名思义还未提交的事务,被其他事务读了。–大家都是透明的。
读提交:一个事务只有提交后,别的事务才能读取到。
可重复读:一个事务看到的数据,总是和这个事务启动时看到的数据是一致的。同时,未提交的事务对其他事务是不可见的。–我开始的能看到什么,那结束前我就还是看到那些。
串行化:对于同一行记录,写会加写锁,读会加读锁。当读写冲突时,后访问的事务必须等前一个事务完成后,才能继续执行。
在这里插入图片描述

提交类型V1V2V3
读未提交222
读提交122
可重复读112
串行化112

从这里可以看到,同一条记录在系统里可能会存在多个值的情况,这是inodb支持事务的基础。它是怎么做到的呢?
其中串行化,因为事务B将1修改为2时,会被锁住。因此要等事务A提交之后,事务B才会执行。
在数据访问时,数据库会创建一个试图作为逻辑结果的输出。在可重复读的隔离级别下,视图是在事务启动的时候创建的,而在读提交级别下,视图是在每个sql语句执行的时候创建的。读未提交没有视图的概念,串行化以加锁的方式防止并行访问。
show variables like “transaction_isolation” #查询当前实例的隔离级别
mysql的事务隔离是怎么实现的呢?
mysql的每条记录在更新的时候,都会记录一条回滚操作。通过回滚操作可以得到前一个状态的值。
讲一个值从1按照顺序改为2,3,4,则在回滚日志里会记录一下信息,这就为同一个值记录了不同版本的信息。不同时刻启动的事务会有不同的read-view。
在这里插入图片描述

set autocommit=1 启动线程的自动提交事务

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_41492331

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值