[分布式]事务处理的常见方法

简介: 处理事务的常见方法有排队法、排他锁、读写锁、MVCC等方式。 排队法         事务处理中最重要也是最简单的方案是排队法,单线程地处理一堆数据。 在Redis中,如果数据全部在内存中,那么单线程处理所有Put、Get操作效率最高。

处理事务的常见方法有排队法、排他锁、读写锁、MVCC等方式。

排队法

        事务处理中最重要也是最简单的方案是排队法,单线程地处理一堆数据。

Redis中,如果数据全部在内存中,那么单线程处理所有PutGet操作效率最高。原因在于多线程的本质是CPU模拟多个线程,这种模拟是以上下文切换为代价,这种上下文切换是需要额外开销的,而对于内存的数据库来说,没有上下文切换时效率最高。因此,单个CPU绑定一块内存的数据,针对这块数据做多次读写操作时都是在单个CPU上完成的,单线程处理方式在内存的情况是效率是最优的。

        那么什么时候事务需要用到多线程呢?这个问题的本质取决于下层所使用的存储,如果是内存操作,则可以动态地申请和销毁

内存块;而磁盘的IOPS很低,但吞吐量很高。

        如果一个场景涉及多次读写操作,单线程可以很高的效率对于内存进行读写操作;但是,由于磁盘的IOPS仅为内存的几千分之

一,如果依旧用操作内存的方式操作磁盘,那系统的整体性能将会很低,这意味着必须将大量的读写操作聚合成一个Batch后再提交

时才能达到较好的性能。而将大量请求攒到一起的方式一是异步,也就是请求本身和线程不绑定,线程可以不Block(本质来说还是

一种多线程的方式),处理完一个线程后再处理其他线程。这种做法的核心是将大量不同的请求提交到一个Buffer中,再由该Buffer

统一读取或者写入磁盘,从而提高效率。在慢速设备中,多线程或异步非常常见,在设计系统时,面对磁盘、网络、SSD等慢速设

备必须考虑使用多线程。

排它锁

        有些场景不适合用单线程操作,可以利用排他锁的方式来快速隔离并发读写事务。

        若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。这就保证了其他事务在T释放A上的锁之前不能再读取和修改A。

读写锁

        数据库中有一些事务单元是共享的,如果是一个只读的事务,例如只对数据进行查询操作,在该过程中数据一定不被修改,因此多个查询操作可以并行执行,因此一种针对读读场景的优化自然而然产生——读写锁。读写锁的核心是在多次读的操作中,同时允许多个读者来访问共享资源,提高并发性。

MVCC

        在最初的数据库事务实现中是不存在MVCC的,它是Oracle在八十年代新加的功能,本质是Copy On Write,也就是每次写都是以重新开始一个新的版本的方式写入数据,因此,数据库中也就包含了之前的所有版本。在数据读的过程中,先申请一个版本号,如果该版本号小于正在写入的版本号,则数据一定可以查询到,无需等到新版本完全写完即可返回查询结果。这种方式可以在读读不阻塞的前提下,实现读写/写读不阻塞,尽可能保证所有的读操作并行,而写操作串行。

目录
相关文章
|
缓存 运维 NoSQL
分布式ID生成方法的超详细分析(全)
目录前言1. UUID2. 数据库自增3. 数据库集群4. 数据库号段5. redis模式6. 雪花算法7. 其他总结 前言 关于什么是分布式ID 数据量不是很多的时候,单一个数据库表可以支撑其业务,即使数据在大也可以主从复制 到一定量的数据时,实现分库分表的时候,就需要一个全局唯一的ID,订单的编号就是分布式ID 关于上面牵扯到的主从复制 可看我之前的文章进行查缺补漏 关于主从复制的超详细解析(全) 关于数据库的分布式ID可看我之前在Mycat种提及到 具体都有如下: 在实现分库分表的情况下,数据库自增主
248 0
分布式ID生成方法的超详细分析(全)
|
8月前
|
调度
考虑充电负荷空间可调度特性的分布式电源与电动汽车充电站联合配置方法(Matlab代码实现)
考虑充电负荷空间可调度特性的分布式电源与电动汽车充电站联合配置方法(Matlab代码实现)
|
4月前
|
编译器 定位技术 开发工具
分布式版本控制系统Git的下载、安装与使用其复制GitHub项目代码的方法
分布式版本控制系统Git的下载、安装与使用其复制GitHub项目代码的方法
|
9月前
|
算法 安全
分布式光伏储能系统的优化配置方法(Matlab代码实现)
分布式光伏储能系统的优化配置方法(Matlab代码实现)
131 0
|
5月前
|
消息中间件 缓存 NoSQL
阿里云国际站代理商:Redis实现分布式配置管理的方法与应用案例
@luotuoemo飞机@TG阿里云国际站代理商:Redis实现分布式配置管理的方法与应用案例,为了实现高可用和负载均衡,可以将Redis部署成哨兵集群或集群模式。哨兵负责监控主从节点的状态,发现故障时自动进行故障转移。集群模式可以提高系统的可扩展性,通过添加更多的从节点来分摊负载压力。
|
6月前
|
JSON 数据格式 索引
60分布式电商项目 - FreeMarker实用方法
60分布式电商项目 - FreeMarker实用方法
25 0
|
8月前
|
算法
【最优潮流】基于分布式交变方向乘法器(ADMM)方法来求解带碳排放交易的直流动态最优潮流(Matlab代码实现)
【最优潮流】基于分布式交变方向乘法器(ADMM)方法来求解带碳排放交易的直流动态最优潮流(Matlab代码实现)
|
9月前
|
机器学习/深度学习 算法 调度
分布式光伏发电计及气象因子及出力预测方法研究(Matlab代码实现)
分布式光伏发电计及气象因子及出力预测方法研究(Matlab代码实现)
200 0
|
9月前
|
调度
计及光伏电站快速无功响应特性的分布式电源优化配置方法(Matlab代码实现)
计及光伏电站快速无功响应特性的分布式电源优化配置方法(Matlab代码实现)
|
9月前
|
调度
考虑充电负荷空间可调度特性的分布式电源与电动汽车充电站联合配置方法(Matlab
考虑充电负荷空间可调度特性的分布式电源与电动汽车充电站联合配置方法(Matlab

热门文章

最新文章