摘要:
mysql与mdb之间的交互是困难的所在, 这之中尤其以并发控制为核心.
并发控制首先在理论上其实并没有太多难以理解的东西, 核心在于具体的实现, 我这么说自然是有原因的, 对于并发控制的理论, 脱离不开事物的一些特性以及利用锁进行串行化, 理论上并不复杂.
但是在实现层面就需要考虑非常多的细节.
本文以项目代号m为依据, 思考一些进行并发控制的整体上的方向.
mdb可以被以模块进行抽象来做并行控制的原因:
一. mdb抽象出了mvc
- 从名字上直白的看出是版本控制
- 模块内部其实是对事物调度的封装
- mvc对于事物的处理提供了简化的接口
- 例如在内部处理事务的失败回滚
- 以及在内部处理子事物和check point
- 上层业务仅调用mvc的接口, 调用流程非常清晰
二. mdb的客户连接也是一个新的线程
- 和mysql的处理一致, mysql也是一个客户连接一个新的线程
- 这样就可以将mysql的客户线程, 与mdb的客户线程,进行关联
- 也就是说将mysql的客户线程, 当作是mdb的客户线程
- 这时所需要关注的就是mdb的客户线程对于客户资源的封装问题了
三. mdb中的嵌入式的模块处于用户模块线程管理下层
- 在调用嵌入式模块时, 已经处于用户线程内
- 这样可以利用mysql的客户线程, 认为是mdb的客户线程, 去调用嵌入式模块
- 这里最需要关注的是什么资源只能隶属于单个客户, 必须归属到客户线程内部
代号m的针对mdb的并发控制设计:
一. mysql的客户线程的封装THD
- THD和客户线程紧密相关, 每个客户端连接的线程都有一个THD
- THD中包含本客户端连接的所有信息
- 可以将mdb的客户信息, 继续填充THD
二. mdb的客户信息的封装
- 其实最根本的还是db句柄monetdbe_database, 嵌入式的模块每个接口都必须将句柄传入
- 所以每个客户端, 需要保持自己的db句柄, 也就是每个客户端连接, 需要保持自己的私有数据的db句柄
- 为了便于后续扩充数据, 创建包装monetdbe_database的数据结构, 以便于持续填充mdb客户线程专有的数据