タイトルのような問題が発生し、解決したので備忘録として残しておく。
問題
Microsoft.Data.Sqlite
を使ってSQLiteの対象のテーブルに書き込みを行う際に、以下のようなExceptionが発生していた。
sqlite attempt to write a readonly database
データベースのMode設定(SqliteConnectionStringBuilder.Mode
)はReadWriteに設定済である。
原因
原因としては、Cacheの設定(SqliteConnectionStringBuilder.Cache
)の設定がSharedになっていたこと。
MicrosoftのDocumentをみると以下のような記載がある。
Shared : Shared-cache mode. Connections share a cache. This mode can change the behavior of transaction and table locking.
おそらく、タスクがこのDatabaseを書き込みしている間はテーブルがロックされてしまう。
そのため、別のタスクが書き込みをしようとした場合にReadOnlyとみなされてしまい、上記のようなExceptionが発生したと思われる。
解決策
Cacheの設定(SqliteConnectionStringBuilder.Cache
)の設定をprivateにする。
こうするごとにCacheがタスクごとに作成され、テーブルのロックが発生しない。(今のところ)
Cache=Default
でもよいかもしれないが、Defaultがどのような動作を行うかDocumentに記載がないためひとまずPrivateに設定しておく。