【问题标题】:sqlite3/C transaction begin end -- overflow?sqlite3/C 事务开始结束——溢出?
【发布时间】:2016-11-04 19:40:43
【问题描述】:

在嵌入式系统(内存是一个问题)上的 C 中,为了优化性能,多个插入组合成更大的事务

直观地说,SQLITE 必须将未发送的事务保存在有限内存中某处的缓存中。

  • 'BEGIN TRANSACTION' 和 'END TRANSACTION' 的两次调用之间是否有可能插入过多?缓存会溢出吗?
  • 或者,sqlite3 是否会处理它并在溢出发生之前启动事务?
  • 如果缓存可能溢出,调用 BEGIN/END 的最佳策略是什么?

【问题讨论】:

    标签: c memory-management sqlite transactions


    【解决方案1】:

    您所做的任何更改都会写入数据库文件。为了支持回滚,更改的数据库页面的旧内容保存在日志文件中。 当你提交一个事务时,日志文件就被删除了;当您回滚事务时,这些页面会被写回。

    所以一个事务的数据大小没有限制,只要你有足够的磁盘空间。

    (缓存可以帮助避免一些写入,但它是透明的,不会影响代码的语义。)

    【讨论】:

    • 所以“事务延迟插入”只不过是写入日志文件,而不是写入内存?
    • “延迟”是什么意思?
    • 延迟:'开始交易','插入','插入','插入' ...'结束交易'。也就是说,“插入”到数据库中不会立即发生,而是在调用“结束事务”时发生。
    • 其他连接无法观察到这一点,因为数据库已锁定。实际延迟仅因缓存而发生。
    猜你喜欢
    • 2021-10-07
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多