三个外交事务mammalian载入,统计数据能惟一吗?
如前所述Vue3+Vite+TS,伊瓦诺PCBelement-plus销售业务模块download:https://www.51xuebc.com/thread-385-1-1.html
我先嘿嘿试题是有关甚么的。
他们假定有这种三个使用者注册登记情景。使用者允诺与此同时注册登记三个新使用者。
您有三个资料库表,即上面的使用者表。
为的是保证这一点儿,商品副经理明确要求使用者间的电话号码无法多次重复。他们想不到了represents资料库,再推论。假如存有,他们就优先选择退出,不然就填入两条统计数据。伪标识符如下表所示。
优先选择phone_no =2的使用者;//查阅sql
假如(使用者存有){
回到
}不然{
填入使用者;//填入sql}
拷贝标识符
但这是四条sql句子。具体来说,继续执行查阅sql,接着下定决心与否继续执行填入sql。每天使用者注册登记时单厢继续执行该方法论。
所以,假如这时有数个使用者在做操作方式,那个方法论就会mammalian继续执行。
假如二者与此同时继续执行,在第三个sql句子继续执行后,将找不到任何使用者。这时,三个填入都被继续执行,从而出现三个相同的统计数据。
于是,有人想,这四条sql句子的方法论应该是三个整体,不应该被拆开,于是就想不到了外交事务。通过外交事务,他们将这四条sql句子作为一个整体,要么一起继续执行,要么回滚。
这就是资料库酸中的A(原子性),原子性的完美体现。伪标识符类似于以下内容。
开始;
优先选择phone_no =2的使用者;//查阅sql
假如(使用者存有){
回到
}不然{
填入使用者;//填入sql
}
提交;
拷贝标识符
所以问题来了,那个方法论,mammalian继续执行,能保证统计数据的惟一性吗?
当然不是。
三个外交事务中的数个sql句子实际上是原子性的,它们要么一起成功,要么一起失败。这是真的,但与那个情景无关。外交事务是mammalian继续执行的。第三个外交事务继续执行查阅使用者,但不会阻塞另三个外交事务查阅使用者,所以有可能发现使用者不存有。这时,三个外交事务方法论都推论使用者不存有,接着将其填入资料库。外交事务中的三个sql都成功继续执行,因此填入了三个相同的统计数据。
如何保证统计数据的惟一性?
所以他们来谈谈在上面的情景中,如何保证填入的统计数据是惟一的。方法很多,但今天只讨论mysql的内部做法,不考虑其他外部中间件(如redis分布式锁)。
惟一索引
使用以下命令,您能向资料库使用者表的phone_no字段添加三个惟一索引。
ALTER TABLE ` user ` ADD unique(` phone _ no `);
拷贝标识符
当他们继续执行写操作方式时,比如下表所示面的句子,
填入` user` (` user _ name `,` phone _ no `)值( Xiaohong ,2);
拷贝标识符
第一次填入会成功,第伊瓦诺填入会导致错误。
关键字“phone_no”的多次重复条目“2”
拷贝标识符
意思是phone_no那个字段是惟一的。将phone_no=2相加两次会导致多次重复。
所以回到他们文章开头的情景,他们完美的解决了多次重复填入的问题。
所以问题来了。
为什么惟一索引能保证统计数据的惟一性?
他们来看三个写操作方式,会经历甚么。具体来说,mysql
作为三个资料库,主要分为两层:服务器层和存储引擎层(通常是innodb)。
服务器层主要负责统计数据库链接、权限检查、sql句子检查和优化。当允诺到达存储引擎层时,才是真正的查阅和更新统计数据的操作方式。
众所周知,资料库是持久存储,最终所有统计数据都存储在磁盘上。
资料库读写是直接读写磁盘统计数据吗?
不行,假如直接读写磁盘的话会太慢,为的是加快速度。
它在磁盘前面加了一层内存,叫做缓冲池。里面有很多细节,但最重要的是三个双链表,里面有统计数据页,每个统计数据页的默认大小是16kb,统计数据页包含了磁盘的统计数据。
所以有了这层缓冲池内存,无论是读写操作方式,mysql都能先操作方式这部分内存。假如你要读写的统计数据页不在缓冲池中,能去磁盘取。因为读写内存比读写磁盘快很多。
所以引擎读写速度要快得多。
但这还不够。很多时候,在写操作方式的时候,我的诉求就是把xx更新为xx或者填入xx。资料库知道这些就够了。我根本不需要知道统计数据页面是甚么样子的。
有点抽象?举个例子吧。
比如我想把那个id=1的统计数据的phone_no字段更新为100,资料库知道那个就够了。至于那个统计数据的原phone_no等于20还是30,根本不重要。反正最终会成为我想要的手机_no=100。
也就是说,假如有这种一块内存,记录下我要把统计数据改成甚么,接着异步慢慢更新到磁盘统计数据。接着一开始我甚至不需要把这些统计数据从磁盘读入缓冲池。根据那个想法,改变缓冲区来了。
结果就是在用普通索引写统计数据的时候,它只需要把自己想写的写在变更缓冲区上,就立刻结束并回到。在后面,innodb engine获取那个更改缓冲区,接着将磁盘统计数据异步读入内存,将更改缓冲区的统计数据修改到统计数据页中,接着将其写回磁盘。那个速度上升了,秒。
但是当它被放在惟一索引中时,那个更改缓冲区不起作用。毕竟,它必须保证真的只有两条数据,所以你必须检查资料库,看看与否真的有这条统计数据。
因此,对于填入情景,普通索引将需求抛入更改缓冲区并回到,而惟一索引需要实际将统计数据从磁盘读取到内存中,查阅与否有多次重复,接着填入没有多次重复的统计数据。
那个惟一的索引在性能上损失了一些。
所以回到为甚么惟一索引能保证统计数据的惟一性的问题,一句话,惟一索引会绕过更改缓冲区,保证磁盘统计数据读入内存后再推论统计数据与否存有。假如不存有,能填入统计数据。不然,将报告三个错误,以确保统计数据的惟一性。
摘要
添加惟一索引能保证统计数据mammalian载入时统计数据的惟一性,最方便省心。
普通索引通过在资料库中引入一层缓冲池内存来提高读写速度,利用变更缓冲区来提高统计数据填入的性能。
惟一索引将绕过更改缓冲区,以保证在推论统计数据与否存有之前将磁盘统计数据读入内存。假如不存有,能填入统计数据。不然,将报告三个错误,以保证统计数据是惟一的。