物流管理网站建设,深圳欧啦啦网站建设,襄阳门户网站建设,wordpress对seo友好吗目录
1.原子性和持久性
1.1.手动提交事务
1.2.自动提交事务 1.3.事务的原理#xff1a;
2.隔离性
1.读未提交#xff08;Read Uncommitted#xff09; 2.读提交#xff08;Read Committed#xff09;
3.可重复读
4.串行化
3.一致性
4.理解读提交和可重复读的实现…目录
1.原子性和持久性
1.1.手动提交事务
1.2.自动提交事务 1.3.事务的原理
2.隔离性
1.读未提交Read Uncommitted 2.读提交Read Committed
3.可重复读
4.串行化
3.一致性
4.理解读提交和可重复读的实现原理区别
4.1.模拟 MVCC
4.2.read view
4.3.RR 与 RC的本质区别 事务的4大属性原子性持久性隔离性一致性
在mysql中只有innodb支持事务myisam是不支持事务的
事务的作用
由于事务的隔离性多个用户同时访问数据库时不必担心相互之间的影响提高并发性和数据安全性事务的提交和回滚操作还可以保证数据的安全性和完整性
1.原子性和持久性
1.1.手动提交事务 1.事务的基本操作 使用begin或者start transaction,创建事务中间可以增删改操作使用commit提交事故 2.创建保存点和回滚操作 savepoint 标记rollback to 标记回滚到标记位置rollback回滚到事务开头begin位置 只要事务未提交未commit就可以使用回滚操作 1.2.自动提交事务
查看自动提交事务状态show variables like autocommit;
设置为关闭SET AUTOCOMMIT0;
设置为开启SET AUTOCOMMIT1;
由下图可以得出
自动提交事务是对输入单条sql语句不使用手动提交的情况做自动提交如果关闭自动提交那么单条sql不会被写入磁盘保证原子性 1.3.事务的原理 原子性要么做完要么不做没有中间态 可以分为3个状态执行前执行中执行后
1.事务的3个状态可以为
执行前使用begin从磁盘中把数据拿到内核缓冲区再从内核缓冲区拷贝到用户层的buffer pool中简单的说就是把磁盘数据保存到内存的用户层的缓冲区执行中使用sql语句对拿到内存中数据进行增删改执行后使用commit把修改的内存数据拿到磁盘去
如何保证的原子性如果不使用commit交付数据事务结束后就自动会回滚到执行前使用commit交付数据那么就是执行后
持久性是什么就是已经交付的数据commit就会保存在磁盘中且不受回滚的约束
2.隔离性
MySQL服务可能会同时被多个客户端进程(线程)访问访问的方式以事务方式进行并发执行数据库中为了保证事务并发执行过程中尽量不受干扰就有了一个重要特征隔离性在不同的场景需要不同的隔离级别有4种读未提交、读提交、可重复读、串行化
查看设置隔离级别 select global.tx_isolation;查看全局隔离级别 select session.tx_isolation;查看会话隔离级别 设置隔离等级格式set session/global transaction isolation level read uncommitted/read committed/repeatable read/serializable; //全局和会话选一个隔离等级4选1 设置会话隔离等级 1.读未提交Read Uncommitted
在该隔离级别所有的事务都可以看到其他事务没有提交的执行结果。实际生产中不可能使用这种隔离级别的但是相当于没有任何隔离性也会有很多并发问题脏读幻读不可重复读
脏读一个事务进行增删改另一个正在执行的事务可以读取到未提交commit的数据
脏读的问题举例要对查询到表的多条记录发奖励另外一个事务新增了一行记录且没有提交那么奖励多发一个 2.读提交Read Committed
该隔离级别是大多数数据库的默认的隔离级别不是 MySQL 默认的。它满足了隔离的简单定义:一个事务只能看到其他的已经提交的事务所做的改变有不可重复读的问题
不可重复读多个事务并发执行一个事务增/删/改一条数据且提交其他的正在执行的事务就可以看到这条数据
不可重复的问题举例我们按分数发奖励100分发100块钱90分发50块钱80分发30块小明得了100分在比较100分的时候给他发100块在比较90分的时候入过另一个事务把小明改为90分并且提交那么小明又可以得到50块那么就出问题了 3.可重复读
概念这是MySQL默认的隔离级别它确保同一个事务在执行中多次读取操作数据时会看到同样的数据行。但是一般数据库会有幻读问题mysql没有这个问题被解决了
幻读这一系列隔离都是加锁完成的但是新增的数据没到磁盘一般锁不能限制所以其他事务插入查询时会看到新增数据mysql是使用Next-Key锁(GAP行锁)解决的 4.串行化 概念: 这是事务的最高隔离级别它通过强制事务排序使之不可能相互冲突从而解决了 幻读的问题。它在每个读的数据行上面加上共享锁。但是可能会导致超时和锁竞争这种隔离级别太极端 实际生产基本不使用 3.一致性
例如转账问题A有1000B有800A给B转账200A有800B拥有1000
一致性的概念事务执行的结果必须使数据库从一个一致性状态变到另一个一致性状态。A有1000B有800是一个一致性状态A有800B有1000是另一个一致性状态
如何保证转账成功呢防止A转账了B没有收到了
有回滚和提交这种方法原子性保护已经修改的数据不会回滚持久性并发执行不受影响隔离性用户对A和B的数据修改
由上可得一致性并没有具体的实例是由用户和mysql的特性来共同来维护的概念
4.理解读提交和可重复读的实现原理区别
数据库并发的场景有三种
读读不存在任何问题也不需要并发控制读写有线程安全问题可能会造成事务隔离性问题可能遇到脏读幻读不可重复读写写有线程安全问题可能会存在更新丢失问题
读写
多版本并发控制 MVCC 是一种用来解决 读-写冲突 的无锁并发控制
4个记录隐藏列字段
DB_TRX_ID 6 byte最近修改( 修改/插入 )事务ID记录创建这条记录/最后一次修改该记录的事务ID识别不同事务身份DB_ROLL_PTR : 7 byte回滚指针指向这条记录的上一个版本简单理解成指向历史版本就行这些数据一 般在 undo log 中DB_ROW_ID : 6 byte隐含的自增ID隐藏主键如果数据表没有主键 InnoDB 会自动以 DB_ROW_ID 产生一 个聚簇索引删除flag隐藏字段, 既记录被更新或删除并不代表真的删除而是删除flag变了,flag0未删flag1已删除内存 加上隐藏列: undo日志
是一个内存缓冲区用来保存日志数据
4.1.模拟 MVCC
修改张三这行记录的过程
事务10,因为要修改所以要先给该记录加行锁。修改前现将改行记录拷贝到undo log中所以undo log中就有了一行副本数据。(原理就是写时拷贝)所以现在 MySQL 中有两行同样的记录。现在修改原始记录中的name改成 李四。并且修改原始记录的隐藏字段 DB_TRX_ID 为当前 事务10 的ID, 我们默认从 10 开始之后递增。而原始记录的回滚指针 DB_ROLL_PTR 列 里面写入undo log中副本数据的地址从而指向副本记录既表示我的上一个版本就是它事务10提交释放锁。 现在有一个事务11要对当前记录的age修改为38 这样我们就有了一个基于链表记录的历史版本链。所谓的回滚无非就是用历史数据覆盖当前数据。
上面的一个个版本我们可以称之为一个个的快照。
当前读读取最新的记录就是当前读。增删改都叫做当前读select也有可能当前读比如select lock in share mode(共享锁), select for update快照读读取历史版本(一般而言)就叫做快照读。
4.2.read view
read view是一个类mysql1使用c实现下面是它的一部分
class ReadView {
// 省略...
private:/** 高水位大于等于这个ID的事务均不可见*/
trx_id_t m_low_limit_id/** 低水位小于这个ID的事务均可见 */
trx_id_t m_up_limit_id;/** 创建该 Read View 的事务ID*/
trx_id_t m_creator_trx_id;/** 创建视图时的活跃事务id列表*/
ids_t m_ids;
//省略...
};
无论是读提交还是可重复读都遵守下面的概念它们两的区别不在这里所以不要想着它们的概念来理解下面的图反而更难理解由read view来决定可不可读形成快照后分为3部分第一部分都可读第二部分提交的就可读第三部分都不可读
第一部分creator_limit_idDB_TRX_ID就是自己的事务id当然可读DB_TRX_IDup_limit_id说明不在这个m_ids活跃事务id列表范围之内而且因为事务id自增长的比最小活跃事务还小说明它以前已经提交的第二部分up_limit_id到low_limit_id之间不就是m_ids里面的活跃事务吗那么已经提交的可读未提交不可读这里不是不可重复读问题读提交和可重复读都支持read view来决定可不可读概念下面说明它们的区别是读提交每次快照读就会生成一个新的read view可重复读快照读生成一个read view就不会再生成了第三部分DB_DRX_IDlow_limit_id,比m_ids的所以活跃事务都大那么是不可读的 4.3.RR 与 RC的本质区别
可重复读隔离等级下 用例1与用例2唯一区别仅仅是 表1 的事务B在事务A修改age前 快照读 过一次age数据而表2的事务B在事务A修改age前没有进行过快照读。
RR 与 RC的本质区别
正是Read View生成时机的不同从而造成RC,RR级别下快照读的结果的不同在RR级别下的某个事务的对某条记录的第一次快照读会创建一个快照及Read View, 将当前系统活跃的其他事务记录起来m_idsRR级别此后在调用快照读的时候还是使用的是同一个Read View所以只要当前事务在其他事务提交更新之前使用活跃事务过快照读那么之后的快照读使用的都是同一个Read View所以对之后的修改第三部分不可见而在RC级别下的事务中每次快照读都会新生成一个快照和Read View, 这就是我们在RC级别下的事务中可以 看到别的事务提交的更新的原因在RC隔离级别下是每个快照读都会生成并获取最新的Read View而在RR隔离级别下则是同一个事务 中的第一个快照读才会创建Read View, 之后的快照读获取的都是同一个Read View。正是RC每次快照读都会形成Read View所以RC才会有不可重复读问题。 文章转载自: http://www.morning.pqxjq.cn.gov.cn.pqxjq.cn http://www.morning.yrhsg.cn.gov.cn.yrhsg.cn http://www.morning.xmjzn.cn.gov.cn.xmjzn.cn http://www.morning.dmzmy.cn.gov.cn.dmzmy.cn http://www.morning.kpygy.cn.gov.cn.kpygy.cn http://www.morning.nflpk.cn.gov.cn.nflpk.cn http://www.morning.hfxks.cn.gov.cn.hfxks.cn http://www.morning.rhph.cn.gov.cn.rhph.cn http://www.morning.blxlf.cn.gov.cn.blxlf.cn http://www.morning.rgxcd.cn.gov.cn.rgxcd.cn http://www.morning.msgrq.cn.gov.cn.msgrq.cn http://www.morning.mjtft.cn.gov.cn.mjtft.cn http://www.morning.jtmql.cn.gov.cn.jtmql.cn http://www.morning.rnpt.cn.gov.cn.rnpt.cn http://www.morning.fbxlj.cn.gov.cn.fbxlj.cn http://www.morning.pltbd.cn.gov.cn.pltbd.cn http://www.morning.nbsbn.cn.gov.cn.nbsbn.cn http://www.morning.wnjsp.cn.gov.cn.wnjsp.cn http://www.morning.lizimc.com.gov.cn.lizimc.com http://www.morning.lfjmp.cn.gov.cn.lfjmp.cn http://www.morning.rkfgx.cn.gov.cn.rkfgx.cn http://www.morning.gjmll.cn.gov.cn.gjmll.cn http://www.morning.fqqlq.cn.gov.cn.fqqlq.cn http://www.morning.znrlg.cn.gov.cn.znrlg.cn http://www.morning.egmux.cn.gov.cn.egmux.cn http://www.morning.byshd.cn.gov.cn.byshd.cn http://www.morning.ypbdr.cn.gov.cn.ypbdr.cn http://www.morning.pttrs.cn.gov.cn.pttrs.cn http://www.morning.blxor.com.gov.cn.blxor.com http://www.morning.hqsnt.cn.gov.cn.hqsnt.cn http://www.morning.jgmdr.cn.gov.cn.jgmdr.cn http://www.morning.rtlg.cn.gov.cn.rtlg.cn http://www.morning.pzqnj.cn.gov.cn.pzqnj.cn http://www.morning.brsgw.cn.gov.cn.brsgw.cn http://www.morning.qpqwd.cn.gov.cn.qpqwd.cn http://www.morning.xbtlt.cn.gov.cn.xbtlt.cn http://www.morning.mhmcr.cn.gov.cn.mhmcr.cn http://www.morning.rbhcx.cn.gov.cn.rbhcx.cn http://www.morning.rxyz.cn.gov.cn.rxyz.cn http://www.morning.knryp.cn.gov.cn.knryp.cn http://www.morning.tqbyw.cn.gov.cn.tqbyw.cn http://www.morning.zsyrk.cn.gov.cn.zsyrk.cn http://www.morning.zqcgt.cn.gov.cn.zqcgt.cn http://www.morning.rsfp.cn.gov.cn.rsfp.cn http://www.morning.xnnpy.cn.gov.cn.xnnpy.cn http://www.morning.nnqrb.cn.gov.cn.nnqrb.cn http://www.morning.grcfn.cn.gov.cn.grcfn.cn http://www.morning.pswqx.cn.gov.cn.pswqx.cn http://www.morning.mrttc.cn.gov.cn.mrttc.cn http://www.morning.lhgkr.cn.gov.cn.lhgkr.cn http://www.morning.gmgnp.cn.gov.cn.gmgnp.cn http://www.morning.fblkr.cn.gov.cn.fblkr.cn http://www.morning.kndst.cn.gov.cn.kndst.cn http://www.morning.bpmth.cn.gov.cn.bpmth.cn http://www.morning.crdtx.cn.gov.cn.crdtx.cn http://www.morning.mhmcr.cn.gov.cn.mhmcr.cn http://www.morning.xrlwr.cn.gov.cn.xrlwr.cn http://www.morning.fbnsx.cn.gov.cn.fbnsx.cn http://www.morning.fosfox.com.gov.cn.fosfox.com http://www.morning.jgttx.cn.gov.cn.jgttx.cn http://www.morning.litao4.cn.gov.cn.litao4.cn http://www.morning.pcqdf.cn.gov.cn.pcqdf.cn http://www.morning.jhqcr.cn.gov.cn.jhqcr.cn http://www.morning.fhhry.cn.gov.cn.fhhry.cn http://www.morning.lfdmf.cn.gov.cn.lfdmf.cn http://www.morning.krjyq.cn.gov.cn.krjyq.cn http://www.morning.yxshp.cn.gov.cn.yxshp.cn http://www.morning.wfwqr.cn.gov.cn.wfwqr.cn http://www.morning.kxwsn.cn.gov.cn.kxwsn.cn http://www.morning.zqcgt.cn.gov.cn.zqcgt.cn http://www.morning.bsrp.cn.gov.cn.bsrp.cn http://www.morning.jghty.cn.gov.cn.jghty.cn http://www.morning.alive-8.com.gov.cn.alive-8.com http://www.morning.dkfrd.cn.gov.cn.dkfrd.cn http://www.morning.dwmmf.cn.gov.cn.dwmmf.cn http://www.morning.ptwqf.cn.gov.cn.ptwqf.cn http://www.morning.ywndg.cn.gov.cn.ywndg.cn http://www.morning.lbgsh.cn.gov.cn.lbgsh.cn http://www.morning.qwnqt.cn.gov.cn.qwnqt.cn http://www.morning.llqch.cn.gov.cn.llqch.cn