遇到的许多数据库(像sql Server)使用单个文件来存储整个数据库.这似乎是一个很常见的方法.将整个数据库存储在单个文件中有哪些优点,而不是将数据分解成更多的逻辑单元,例如每个文件的单个表.
另外,数据库如何在内部工作.它如何处理不同线程对同一文件的并发写入.在大多数应用程序中,我看到您只能在文件中一次打开一个写入句柄.各种数据库引擎如何处理并发写入.
解决方法
一个单独的非碎片大文件可以被服务器应用程序处理,就像原始磁盘被操作系统处理一样:随机可寻址的字节块.如果数据库服务器选择了,则可以在该字节块之上实现整个文件系统,如果将表实现为单独的文件是有益的.
并发写入同一文件的不同部分不是问题.数据库使用锁定策略来确保多个线程不尝试访问该文件的相同部分,这是数据库事务存在的主要原因之一:隔离一个事务与另一个事务的可见效果.
例如,数据库服务器可能会跟踪通过哪些飞行中的事务访问哪些表的行?当事务退出时,它触发的行被释放,以便它们可以被其他事务自由访问.在这种情况下,其他事务可能会简单地阻止 – 即等待 – 当他们尝试访问当前正在另一个事务的一部分的行时.如果其他事务在合理(可配置)时间内未完成,则等待的事务可能会中止.通常这个原因是一个僵局.然后,使用数据库的应用程序可以选择(如果需要)重试事务.
这种锁定可以使用信号量或其他同步机制来实现,这取决于性能折衷.