为什么美国程序员不用加班
所以业界很早就推出了各种分布式的服务器端开发框架,最著名的就是“EJB”——企业JavaBean。但凡冠以“企业”的技术,往往都是分布式下所需的部分,而EJB这种技术,也是一种分布式对象调用的技术。我们如果需要让多个进程合作完成任务,则需要把任务分解到多个“类”上,然后这些“类”的对象就会在各个进程容器中存活,从而协作提供服务。这个过程很“面向对象”。每个对象都是一个“微服务”,可以提供某些分布式的功能。
而另外一些系统,则走向学习互联网的基本模型:HTTP。所以就有了各种的WebService框架,从开源的到商业软件,都有各自的WebService实现。这种模型,把复杂的路由、编解码等操作,简化成常见的一次HTTP操作,是一种非常有效的抽象。开发人员开发和部署多个WebService到Web服务器上,就完成了分布式系统的搭建。 分布式系统在开发效率上造成的问题和解决思路 根据上文所述,分布式系统在业务需求的功能以为,还需要增加额外很多非功能的需求。这些非功能需求,往往都是为了一个多进程系统能稳定可靠运行而去设计和实现的。这些“额外”的工作,一般都会让你的代码更加复杂,如果没有很好的工具,就会让你的开发效率严重下降。 微服务框架:EJB、WebService
当我们在讨论服务器端软件分布的时候,服务进程之间的通信就难免了。然而服务进程间的通讯,并不是简单的收发消息就能完成的。这里还涉及了消息的路由、编码解码、服务状态的读写等等。如果整个流程都由自己开发,那就太累人了。 插入意向锁 插入意向锁(简称为 II Gap)是一种特殊的间隙锁,只有在插入记录的时候才会使用,这个锁表示插入的意向。它与上面说到的表级意向锁是完全不同的,插入意向锁是属于行级锁,并且互相之间是兼容的,互不冲突,所以多个事务可以同时获取到相同间隙的 II Gap 锁。 官方示例: 假设有索引记录,其值分别为4和7,单独的事务分别尝试插入值5和6,在获得插入行的排他锁之前,每个事务都使用插入意图锁来锁定4和7之间的间隙,但不要互相阻塞,因为行是无冲突的。 插入意向锁只会和间隙锁和 Next-Key 锁冲突。因为间隙锁的主要作用是防止幻读的发生,而在插入操作执行前需要获取到插入意向锁,而插入意向锁和间隙锁之间是冲突的,可以阻塞插入操作,所以间隙锁可以防止幻读的发生。 AUTO-INC 锁 AUTO-INC 锁又称为自增锁(简称 AI 锁)。它是特殊的表锁,在插入数据到具有 AUTO_INCREMENT 列的表时使用。当插入数据的表中有自增列时,数据库需要自动生成自增值,在生成之前,它会先获取到相关表的 AUTO-INC 锁。其他事务的插入操作将会被阻塞,这样可以保证自增值的唯一性。 AUTO-INC 锁具有如下特点:
因为在插入时会使用到该表锁,所以必然会造成并发插入性能的下降。因此 InooDB 提供了一个 innodb_autoinc_lock_mode 配置项用于控制自增锁的算法,该配置项可以使用户选择如何在可预测的自动增量值序列与插入操作的最大并发性之间进行权衡。 该配置有三个可选项: 0:使用传统的锁定模式,并发性能最差。 1:默认采用的模式。 2:并发性能最高,但是不能保证同一条 insert 语句内的自增值是连续的。 想要了解更多关于此配置的内容可以查看 MySQL 的这篇文档。 总结
InnoDB 的四种行锁的兼容性,如下表所示: (编辑:宜春站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |