Qt如何实现对SQLite的写入与更新 *** 作的,急!

Qt如何实现对SQLite的写入与更新 *** 作的,急!,第1张

点击一下查看按钮,会添加一条信息,在pc机上很容易实现了,但在Arm开饭板上,数据库能打开但执行插入的 *** 作的时候总是报错,我把我能想到的可能都想到了,1,修改了一下数据库的权限,2,export

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/Trolltech/QtEmbedded-470-arm/plugins/sqldrivers

,sqlite库的路径也加上了,但运行结果是一样的,错误提示不是打开数据库失败,就是动态库超出链接队列什么的(英语不太好),总之不行。后来我决定采取比较二的选择,在arm板linux系统上跑sqlite插件,后来还是以失败告终(但得到了好多启发,下片博文讲),无奈我想到的办法是整一个好的sqliteDemo

在板子上跑一下,执行sql语句的时候还是不行,报错信息是打开数据库失败,无奈做了下一步决定,重烧了一下文件系统,和内核,结果还是不行,在崩溃的边缘,向老大求教,捣鼓了一阵,结果把生成的可执行文件放到了根目录下成功了!可以对数据库进行各种 *** 作,我把我自己写的Qt

sqlite的小demo也放到了根目录下结果也成功运行了,很奇怪呀!网上还有人说友善的arm板子对数据库的支持不好。

普通修改

批量修改

-->

说一下修改过程

先是把回滚日志写到磁盘,把修改变化页保存到内存里面,具体如下:

 如果某一进程要想在数据库上执行写 *** 作,那么必须先获取共享锁,在共享锁获取之后再获取保留锁。因为保留锁则预示着在将来某一时刻该进程将会执行写 ***

作,所以在同一时刻只有一个进程可以持有一把保留锁,但是其它进程可以继续持有共享锁以完成数据读取的 *** 作。如果要执行写 *** 作的进程不能获取保留锁,那么

这将说明另一进程已经获取了保留锁。在此种情况下,写 *** 作将失败,并立即返回SQLITE_BUSY错误。在成功获取保留锁之后,该写进程将创建回滚日

志。

    在对任何数据作出改变之前,写进程会将待修改页中的原有内容先行写入回滚日志文件中,然而,这些数据发生变化的页起初并不会直接写入磁盘文件,而是保留在内存中,这样其它进程就可以继续读取该数据库中的数据了。

    或者是因为内存中的cache已满,或者是应用程序已经提交了事务,最终,写进程将数据更新到数据库文件中。然而在此之前,写进程必须确保没有其它的进程正在读取数据库,同时回滚日志中的数据确实被物理的写入到磁盘文件中,其步骤如下:

    1) 确保所有的回滚日志数据被物理的写入磁盘文件,以便在出现系统崩溃时可以将数据库恢复到一致的状态。

    2) 获取PENDING锁,再获取排他锁,如果此时其它的进程仍然持有共享锁,写入线程将不得不被挂起并等待直到那些共享锁消失之后,才能进而得到排他锁。

    3) 将内存中持有的修改页写出到原有的磁盘文件中。

  

 如果写入到数据库文件的原因是因为cache已满,那么写入进程将不会立刻提交,而是继续对其它页进行修改。但是在接下来的修改被写入到数据库文件之

前,回滚日志必须被再一次写到磁盘中。还要注意的是,写入进程获取到的排他锁必须被一直持有,直到所有的改变被提交时为止。这也意味着,从数据第一次被刷

新到磁盘文件开始,直到事务被提交之前,其它的进程不能访问该数据库。

    当写入进程准备提交时,将遵循以下步骤:

    4) 获取排他锁,同时确保所有内存中的变化数据都被写入到磁盘文件中。

    5) 将所有数据库文件的变化数据物理的写入到磁盘中。

    6) 删除日志文件。如果在删除之前出现系统故障,进程在下一次打开该数据库时仍将基于该HOT日志进行恢复 *** 作。因此只有在成功删除日志文件之后,我们才可以认为该事务成功完成。

    7) 从数据库文件中删除所有的排他锁和PENDING锁。

    一旦PENDING锁被释放,其它的进程就可以开始再次读取数据库了。

    如果一个事务中包含多个数据库的修改,那么它的提交逻辑将更为复杂,见如下步骤:

    4) 确保每个数据库文件都已经持有了排他锁和一个有效的日志文件。

    5) 创建主数据库日志文件,同时将每个数据库的回滚日志文件的文件名写入到该主数据库日志文件中。

    6) 再将主数据库日志文件的文件名分别写入到每个数据库回滚日志文件的指定位置中。

    7) 将所有的数据库变化持久化到数据库磁盘文件中。

    8) 删除主日志文件,如果在删除之前出现系统故障,进程在下一次打开该数据库时仍将基于该HOT日志进行恢复 *** 作。因此只有在成功删除主日志文件之后,我们才可以认为该事务成功完成。

    9) 删除每个数据库各自的日志文件。

    10)从所有数据库中删除掉排他锁和PENDING锁。

    

  

 最后需要说明的是,在SQLite2中,如果多个进程正在从数据库中读取数据,也就是说该数据库始终都有读 *** 作发生,即在每一时刻该数据库都持有至少一

把共享锁,这样将会导致没有任何进程可以执行写 *** 作,因为在数据库持有读锁的时候是无法获取写锁的,我们将这种情形称为"写饥饿"。在SQLite3中,

通过使用PENDING锁则有效的避免了"写饥饿"情形的发生。当某一进程持有PENDING锁时,已经存在的读 *** 作可以继续进行,直到其正常结束,但是

新的读 *** 作将不会再被SQLite接受,所以在已有的读 *** 作全部结束后,持有PENDING锁的进程就可以被激活并试图进一步获取排他锁以完成数据的修改

*** 作。

以上就是关于Qt如何实现对SQLite的写入与更新 *** 作的,急!全部的内容,包括:Qt如何实现对SQLite的写入与更新 *** 作的,急!、Sqlite数据库的Update知多少、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9513714.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存