抽象的
讨论 NDB Cluster 和 NDB API 中事务处理和传输的机制,以及用于实现这些的对象。
当使用 发送事务时
NdbTransaction::execute()
,它们不会立即传输到 NDB 内核。相反,事务保存在
Ndb
它们所属的对象中的特殊发送列表(缓冲区)中。自适应发送算法决定何时应将事务实际传输到 NDB 内核。
NDB API 被设计为多线程接口,因此通常希望一次从多个线程传输数据库操作。NDB API 跟踪哪些
Ndb
对象在将信息传输到 NDB 内核时处于活动状态,以及与 NDB 内核交互的预期线程数。请注意,给定的实例Ndb
最多只能在一个线程中使用;不同的线程不应该
共享同一个
Ndb
对象。
有四种情况会导致数据库操作从Ndb
对象缓冲区转移到 NDB 内核:
NDB 传输器(TCP/IP 或共享内存)确定缓冲区已满并将其发送出去。缓冲区大小取决于实现,并且可能会在 NDB Cluster 版本之间发生变化。当 TCP/IP 是传输器时,缓冲区大小通常约为 64 KB。由于每个
Ndb
对象为每个数据节点提供一个缓冲区,因此 “完整”缓冲区的概念对于每个数据节点都是本地的。传输信息的统计数据的累积可能会强制向所有存储节点发送缓冲区(即,当所有缓冲区变满时)。
每 10 毫秒,一个特殊的传输线程检查是否发生了任何发送活动。如果没有,则线程将强制传输到所有节点。这意味着 20 毫秒是数据库操作在被分派之前等待的最长时间。NDB Cluster 的未来版本可能会有 10 毫秒的限制;比这更频繁的检查需要操作系统的额外支持。
对于受自适应发送算法影响的方法(例如
NdbTransaction::execute()
),有一个force
参数可以覆盖其在这方面的默认行为并强制立即传输到所有节点。有关详细信息,请参阅各个 NDB API 类列表。
上面列出的条件在 NDB Cluster 的未来版本中可能会发生变化。