初级代码游戏的专栏介绍与文章目录-CSDN博客
我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。
这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。
源码指引:github源码指引_初级代码游戏的博客-CSDN博客
本专题:基于共享内存的内存数据库_初级代码游戏的博客-CSDN博客
从这里开始顺序阅读:一个基于共享内存的内存数据库:1 介绍-CSDN博客
一、存储设计
1.1 设计图
1.2 基本技术指标
1.3 数据类型
1.4 列定义
1.5 索引定义
1.6 数据存储
单一的数据块,存储连续N个数值,回收连续N个数值,可再分配。目前的再分配策略为按照N分配,不同的N不能分配(即不能合并和分割)。
字符串数据实际存储在字符串池,字符串池带索引。目前字符串池空间不可回收。
1.7 索引存储
单一的索引块,存储表的名字、索引的名字和记录指针(指向数据块的连续N个数值),索引本身不存储索引列的数据。
二、并发策略
2.1 三级锁定
2.2 库可配置锁定级别
库的锁定级别可配置,如果库配置为库锁,则所有操作都会提升为库锁,如果库配置为表锁,则记录锁请求被提升为表锁。
2.3 用户可指定锁定级别
用户接口可指定锁定级别,系统自动选择允许的锁定级别。默认锁定级别为库的配置级别。
例如用户指定记录锁,但库配置为表锁,则采用表锁。
2.4 库的锁定级别的选择
2.5 用户操作的锁定级别的选择
本节讨论仅限于用户指定的锁定级别比库设定的级别更高(锁定范围更大)的情形。
注意,指定比库设置更高(更大范围,库>表>记录)的锁定级别将导致锁定提升为独占锁,例如,对记录锁级别的库指定表锁操作将采用独占表锁,不论指定的是独占锁还是并发锁。
应当仅在必要时指定更高的锁定级别,因为这将独占表或库,主要有两种情形适合提升锁定级别:对操作的性能要求很高(例如在一个混合了静态数据和实时数据的库里面)或者是进行维护操作。
2.6 使用限制
基于某些技术上的理由,存在如下使用限制:
1 CShmBD::DropTable是库独占锁定,不能和任何操作同时进行。
2 CShmDB不支持多线程并发操作,CRecordSet可以有多个但每个都不能多线程并发操作
3 同一进程多线程锁定同一条记录可能会死锁,同一进程锁定而等待的记录锁操作会超时出错退出(非同一进程锁定没有超时设定),因此多线程访问同一张表要避免长时间锁定同一条记录。
4 不同进程可能导致死锁,死锁是数据库无法避免的难题。为了尽量减少死锁发生,要尽可能避免同时锁定两个对象。例如进程1以A表为准逐条记录查询B表的相关记录,同时进程2以B表为准逐条记录查询A表的相关记录,这样就会产生一个死锁。这种情形要么程序缓存数据避免同时打开两张表(这样程序就会变得复杂),要么约定必须以A为准查询B(这样能解决一部分问题但很难完善地约束所有相关进程)。
(未完待续)