ホームページ データベース mysql チュートリアル SQLite这么娇小可爱,不多了解点都不行啊

SQLite这么娇小可爱,不多了解点都不行啊

Jun 07, 2016 pm 03:10 PM
sqlite

SQLite,是一款轻型的数据库,是遵守 ACID 的关系型数据库管理系统。它的设计目标是嵌入式的,目前 Android 和 iOS 的设备内置的

   在我眼里,MySQL 和 Oracle 是这样的

SQLite这么娇小可爱,不多了解点都不行啊

SQLite这么娇小可爱,不多了解点都不行啊

而 SQLite 在是这样的

SQLite这么娇小可爱,不多了解点都不行啊

所以这么萌的数据库,我真的应该多了解她的。

简介

SQLite,是一款轻型的数据库,是遵守 ACID 的关系型数据库管理系统。它的设计目标是嵌入式的,目前 Android 和 iOS 的设备内置的都是 SQLite 数据库。SQLite 虽然娇小,但也支持事务和多数的 SQL92 标准。

主要特点

主要缺点

如果只在移动设备使用 SQLite,那么他的优点足够好,并且缺点不明显,所以大叔 MySQL 走开。SQLite 妹妹快过来。

事务与锁(

SQLite 的事务和锁是很重要的概念。

SQLite 有 5 个不同的锁状态

SQLite 有一个加锁表,记录数据库连接的锁状态。每个数据库连接在同一时刻只能处于其中一个锁状态。每种状态(UNLOCKED)都有一种锁与之对应。

数据库连接最初处于 UNLOCKED 状态,在此状态下,连接还没有存取数据库。当连接到了一个数据库,甚至已经用 BEGIN 开始了一个事务时,连接都还处于 UNLOCKED 状态。为了能够从数据库中读取数据,连接必须必须进入 SHARED 状态,也就是说首先要获得一个 SHARED 锁。多个连接可以同时获得并保持共享锁,也就是说多个连接可以同时从同一个数据库中读数据,SQLite 是支持并发读取数据的。

一个连接想要写数据库,它必须首先获得一个 RESERVED 锁。一个数据库上同时只能有一个 RESERVED 锁,保留锁可以与共享锁共存,RESERVED 锁即不阻止其它拥有 SHARED 锁的连接继续读数据库,也不阻止其它连接获得新的 SHARED 锁。 一旦一个连接获得了 RESERVED 锁,它就可以将数据写入缓冲区,而不是实际地写到磁盘。 当连接想要提交修改(或事务)时,需要获得 PENDING 锁,之后连接就不能再获得新的 SHARED 锁了,但已经拥有 SHARED 锁的连接仍然可以继续正常读数据库。当所有其它 SHARED 锁都被释放时,拥有 PENDING 锁的连接就可以将其锁提升至 EXCLUSIVE 锁,此时就可以将以前对缓冲区所做的修改写到数据库文件。所以SQLite 是不支持并发写的。

事务

SQLite 有三种不同的事务

事务类型在 BEGIN 命令中指定:

SQLite这么娇小可爱,不多了解点都不行啊

DEFERRED

一个 DEFERRED 事务不获取任何锁(直到它需要锁的时候),BEGIN 语句本身也不会做什么事情——它开始于 UNLOCK 状态。默认情况下就是这样的,如果仅仅用 BEGIN 开始一个事务,那么事务就是 DEFERRED 的,同时它不会获取任何锁;当对数据库进行第一次读操作时,它会获取 SHARED 锁;同样,当进行第一次写操作时,它会获取 RESERVED 锁。

MMEDIATE

由 BEGIN 开始的 IMMEDIATE 事务会尝试获取 RESERVED 锁。如果成功,BEGIN IMMEDIATE 保证没有别的连接可以写数据库。但是,别的连接可以对数据库进行读操作;但是,RESERVED 锁会阻止其它连接的 BEGIN IMMEDIATE 或者 BEGIN EXCLUSIVE 命令,当其它连接执行上述命令时,会返回 SQLITE_BUSY 错误。这时你就可以对数据库进行修改操作了,但是你还不能提交,当你 COMMIT 时,会返回 SQLITE_BUSY 错误,这意味着还有其它的读事务没有完成,得等它们执行完后才能提交事务。

EXCLUSIVE

EXCLUSIVE 事务会试着获取对数据库的 EXCLUSIVE 锁。这与 IMMEDIATE 类似,但是一旦成功,EXCLUSIVE 事务保证没有其它的连接,所以就可对数据库进行读写操作了。

死锁

如果两个以 BEGIN DEFERRED 开始事务的连接都处于 SHARED 状态,并且都在等待对方结束 SHARED 从而进入 RESERVED 的话,就会进入死锁状态。所以BEGIN DEFERRED 开始的事务是有可能产生死锁的.

Write-Ahead Logging ( >=3.7.0 )

SQLite 3.7.0 之前是不支持写的时候读得。为了能够读得时候写,引入了 Write-Ahead Logging(WAL)机制,这样可以支持一个写和多个读并发。

在引入 WAL 机制之前,SQLite 使用 rollback journal 机制实现原子事务。

rollback journal 机制的原理是:在修改数据库文件中的数据之前,先将修改所在分页中的数据备份在另外一个地方,然后才将修改写入到数据库文件中;如果事务失败,则将备份数据拷贝回来,撤销修改;如果事务成功,则删除备份数据,提交修改。

WAL 机制的原理是:修改并不直接写入到数据库文件中,而是写入到另外一个称为 WAL 的文件中;如果事务失败,WAL 中的记录会被忽略,撤销修改;如果事务成功,它将在随后的某个时间被写回到数据库文件中,提交修改。

同步 WAL 文件和数据库文件的行为被称为 checkpoint(检查点),它由 SQLite 自动执行,默认是在 WAL 文件积累到 1000 页修改的时候;当然,,在适当的时候,也可以手动执行 checkpoint,SQLite 提供了相关的接口。执行 checkpoint 之后,WAL 文件会被清空。

在读的时候,SQLite 将在 WAL 文件中搜索,找到最后一个写入点,记住它,并忽略在此之后的写入点(这保证了读写和读读可以并行执行);随后,它确定所要读的数据所在页是否在 WAL 文件中,如果在,则读 WAL 文件中的数据,如果不在,则直接读数据库文件中的数据。

在写的时候,SQLite 将之写入到 WAL 文件中即可,但是必须保证独占写入,因此写写之间不能并行执行。

WAL 在实现的过程中,使用了共享内存技术,因此,所有的读写进程必须在同一个机器上,否则,无法保证数据一致性。

优点

缺点

  • 访问数据库的所有程序必须在同一主机上,且支持共享内存技术。

  • 每个数据库现在对应 3 个文件:.db,-wal,-shm。

  • 当写入数据达到 GB 级的时候,数据库性能将下降。

  • 3. 7.0 之前的 SQLite 无法识别启用了 WAL 机制的数据库文件。

  • このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

    ホットAIツール

    Undresser.AI Undress

    Undresser.AI Undress

    リアルなヌード写真を作成する AI 搭載アプリ

    AI Clothes Remover

    AI Clothes Remover

    写真から衣服を削除するオンライン AI ツール。

    Undress AI Tool

    Undress AI Tool

    脱衣画像を無料で

    Clothoff.io

    Clothoff.io

    AI衣類リムーバー

    Video Face Swap

    Video Face Swap

    完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

    ホットツール

    メモ帳++7.3.1

    メモ帳++7.3.1

    使いやすく無料のコードエディター

    SublimeText3 中国語版

    SublimeText3 中国語版

    中国語版、とても使いやすい

    ゼンドスタジオ 13.0.1

    ゼンドスタジオ 13.0.1

    強力な PHP 統合開発環境

    ドリームウィーバー CS6

    ドリームウィーバー CS6

    ビジュアル Web 開発ツール

    SublimeText3 Mac版

    SublimeText3 Mac版

    神レベルのコード編集ソフト(SublimeText3)

    PHP と SQLite を使用してユーザー ログイン システムを作成する方法 PHP と SQLite を使用してユーザー ログイン システムを作成する方法 Jul 28, 2023 pm 09:27 PM

    PHP と SQLite を使用してユーザー ログイン システムを作成する方法 今日のインターネット時代では、ユーザー ログイン システムは多くの Web サイトやアプリケーションの基本機能の 1 つです。この記事では、PHP と SQLite を使用して、シンプルで強力なユーザー ログイン システムを作成する方法を紹介します。 SQLite は組み込みデータベース エンジンであり、構成不要のサーバー側データベース エンジンです。 PHP は、SQLite と組み合わせて使用​​して、柔軟で効率的なユーザー ログイン システムを作成できる人気のあるサーバー側スクリプト言語です。による

    PHP と SQLite を使用したユーザー権限とアクセス制御の実装 PHP と SQLite を使用したユーザー権限とアクセス制御の実装 Jul 29, 2023 pm 02:33 PM

    PHP と SQLite を使用したユーザー権限とアクセス制御の実装 最新の Web アプリケーションでは、ユーザー権限とアクセス制御は非常に重要な部分です。適切な権限管理を行うと、許可されたユーザーのみが特定のページや機能にアクセスできるようになります。この記事では、PHP と SQLite を使用して基本的なユーザー権限とアクセス制御を実装する方法を学びます。まず、ユーザーとその権限に関する情報を保存する SQLite データベースを作成する必要があります。以下は簡単なユーザーテーブルと権限テーブルの構造です。

    PHP と SQLite: データの圧縮と暗号化を行う方法 PHP と SQLite: データの圧縮と暗号化を行う方法 Jul 29, 2023 am 08:36 AM

    PHP と SQLite: データを圧縮および暗号化する方法 多くの Web アプリケーションでは、データのセキュリティとストレージ領域の使用率が非常に重要な考慮事項です。 PHP と SQLite は非常に広く使用されている 2 つのツールであり、この記事ではこれらをデータ圧縮と暗号化に使用する方法を紹介します。 SQLite は、別個のサーバー プロセスを持たず、アプリケーションと直接対話する軽量の組み込みデータベース エンジンです。 PHP は、動的スクリプトを構築するために広く使用されている人気のあるサーバー側スクリプト言語です。

    PHP と SQLite を使用したデータのグラフ化と視覚化 PHP と SQLite を使用したデータのグラフ化と視覚化 Jul 28, 2023 pm 01:01 PM

    PHP と SQLite を使用したデータ チャートと視覚化の実装の概要: ビッグ データ時代の到来により、データ チャートと視覚化はデータを表示および分析するための重要な方法になりました。この記事では、PHPとSQLiteを使ってデータチャートや可視化機能を実装する方法を紹介します。 SQLite データベースからデータを読み取り、共通のデータ チャート ライブラリを使用してデータを表示する方法を例として挙げます。準備: まず、PHP および SQLite データベースがインストールされていることを確認する必要があります。インストールされていない場合は、

    シンプルなブログを作成する: PHP と SQLite を使用する シンプルなブログを作成する: PHP と SQLite を使用する Jun 21, 2023 pm 01:23 PM

    インターネットの発展に伴い、ブログはますます多くの人々が自分の生活、知識、アイデアを共有するプラットフォームになりました。自分のブログも作成したい場合は、この記事で PHP と SQLite を使用して簡単なブログを作成する方法を紹介します。ニーズを決定する ブログを作成し始める前に、実現したい機能を決定する必要があります。例: ブログ投稿の作成 ブログ投稿の編集 ブログ投稿の削除 ブログ投稿のリストの表示 ブログ投稿の詳細の表示 ユーザー認証と権限制御 PHP と SQLite のインストール PHP と S をインストールする必要があります

    PHP と SQLite: 長時間の接続、切断と再接続に対処する方法 PHP と SQLite: 長時間の接続、切断と再接続に対処する方法 Jul 29, 2023 am 09:05 AM

    PHP と SQLite: 長時間の接続、切断と再接続に対処する方法 はじめに: Web 開発では、PHP と SQLite はよく使用される 2 つのテクノロジです。ただし、長時間の接続や切断と再接続は、PHP や SQLite を使用するときによく発生する問題の一部です。この記事では、PHP での長時間の接続、切断と再接続の問題に対処する方法を紹介し、開発者がこれらの問題をよりよく理解して解決するのに役立ついくつかのサンプル コードを提供します。 1. 永続的な接続の問題 PHP を使用して SQLite データベースに接続すると、接続が長くなる (永続的)

    全文検索とインデックス作成戦略に PHP と SQLite を使用する方法 全文検索とインデックス作成戦略に PHP と SQLite を使用する方法 Jul 29, 2023 pm 08:45 PM

    全文検索とインデックス付け戦略に PHP と SQLite を使用する方法 はじめに: 最新のアプリケーション開発では、多くの分野で全文検索機能が不可欠です。ブログ、ニュース Web サイト、電子商取引プラットフォームのいずれにおいても、ユーザーはキーワードを使用して検索することに慣れています。したがって、ユーザー エクスペリエンスを向上させ、より良い検索結果を提供するには、適切な検索およびインデックス付け戦略を使用して全文検索機能を提供する必要があります。この記事では、PHP および SQLite データベースを使用して全文検索を実装する方法を検討します。

    PHP と SQLite を使用してデータをインポートおよびエクスポートする方法 PHP と SQLite を使用してデータをインポートおよびエクスポートする方法 Jul 28, 2023 am 11:43 AM

    PHP および SQLite を使用してデータをインポートおよびエクスポートする方法 データのインポートおよびエクスポートは、Web サイトまたはアプリケーションの開発中の一般的なタスクの 1 つです。 PHP と SQLite を使用すると、外部ファイルから SQLite データベースにデータをインポートしたり、データベースから外部ファイルにデータをエクスポートしたりすることが簡単にできます。この記事では、PHP と SQLite を使用してデータをインポートおよびエクスポートする方法を紹介し、対応するコード例を示します。データのインポート まず、インポートするデータを含む外部ファイルを準備する必要があります。このファイル

    See all articles