System.Data.SQLite

Login
This project makes use of Eagle, provided by Mistachkin Systems.
Eagle: Secure Software Automation

Artifact 34840c6d9cb79479fb9169ca72f8d01fa2a255a7:

Ticket change [34840c6d9c] - New ticket [7698550f0f] Database is locked. by anonymous 2018-10-04 21:51:10.
D 2018-10-04T21:51:10.655
J foundin 1.0.109
J icomment Hi,\r\n\r\nI'm\strying\sto\sserialize\sdifferent\swrite\sfrom\sdifferent\sthread\son\sthe\ssame\stable.\s\r\nIf\si\sread\swell\susing\swal\sthis\sis\spossible.\sis\sit?\shttps://www.sqlite.org/wal.html\r\n\r\nIn\sattach\sthere\sis\sa\ssample\sthat\swork\sfor\sa\swhile\s(30\ssecs)\suntil\sit\scatches\san\sexecption\sDatabase\sis\slocked.\r\n\r\nIn\sthe\sexample\si\swrote\sthere\sare\sa\slot\sof\supdate\sthat\sin\smy\sreal\scode\sdon't\sdo.\sBut,\sfor\ssome\sreason\sin\smy\sfinal\scode\si\scatch\sthe\sexception\svery\squickly\s(first\stentative).\r\n\r\n\r\nCan\syou\shelp\sme\sto\sunderstand\sthe\sreason?\r\n\r\nBR\r\n\r\nusing\sSystem;\r\nusing\sSystem.Collections.Generic;\r\nusing\sSystem.Data.SQLite;\r\nusing\sSystem.IO;\r\nusing\sSystem.Linq;\r\nusing\sSystem.Threading;\r\nusing\sSystem.ComponentModel.DataAnnotations;\r\nusing\sSystem.Data.Entity;\r\nusing\sSQLite.CodeFirst;\r\n\r\nnamespace\sSqLiteParallel\r\n{\r\n\s\s\s\spublic\sclass\sApplicationDbContext\s:\sDbContext\r\n\s\s\s\s{\r\n\r\n\s\s\s\s\s\s\s\spublic\sApplicationDbContext(bool\slog\s=\strue)\r\n\s\s\s\s\s\s\s\s\s\s\s\s:\sbase(new\sSQLiteConnection(new\sSQLiteConnectionStringBuilder()\r\n\s\s\s\s\s\s\s\s\s\s\s\s{\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\sDataSource\s=\sPath.Combine(Environment.CurrentDirectory,\s"mydb.db"),\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\sForeignKeys\s=\strue,\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\sBinaryGUID\s=\sfalse,\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\sJournalMode\s=\sSQLiteJournalModeEnum.Wal,\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\sPooling\s=\strue,\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\sSyncMode\s=\sSynchronizationModes.Full,\r\n\r\n\s\s\s\s\s\s\s\s\s\s\s\s}\s+\s""),\strue)\r\n\s\s\s\s\s\s\s\s{\r\n\r\n\s\s\s\s\s\s\s\s\s\s\s\sif\s(!log)\sreturn;\r\n\s\s\s\s\s\s\s\s\s\s\s\sDatabase.Log\s=\sdelegate\s(string\ss)\r\n\s\s\s\s\s\s\s\s\s\s\s\s{\r\n\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\sConsole.WriteLine($"Thr:\s{Thread.CurrentThread.ManagedThreadId}\s-\s{s}");\r\n\s\s\s\s\s\s\s\s\s\s\s\s};\r\n\s\s\s\s\s\s\s\s}\r\n\r\n\r\n\r\n\s\s\s\s\s\s\s\spublic\svirtual\sDbSet<MyTable>\sMyTables\s{\sget;\sset;\s}\r\n\r\n\s\s\s\s\s\s\s\sprotected\soverride\svoid\sOnModelCreating(DbModelBuilder\smodelBuilder)\r\n\s\s\s\s\s\s\s\s{\r\n\s\s\s\s\s\s\s\s\s\s\s\svar\ssqliteConnectionInitializer\s=\snew\sApplicationDbContextInitializer(modelBuilder);\r\n\s\s\s\s\s\s\s\s\s\s\s\sDatabase.SetInitializer(sqliteConnectionInitializer);\r\n\s\s\s\s\s\s\s\s}\r\n\r\n\s\s\s\s\s\s\s\spublic\soverride\sint\sSaveChanges()\r\n\s\s\s\s\s\s\s\s{\r\n\s\s\s\s\s\s\s\s\s\s\s\stry\r\n\s\s\s\s\s\s\s\s\s\s\s\s{\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\sreturn\sbase.SaveChanges();\r\n\r\n\s\s\s\s\s\s\s\s\s\s\s\s}\r\n\s\s\s\s\s\s\s\s\s\s\s\scatch\s(Exception\se)\r\n\s\s\s\s\s\s\s\s\s\s\s\s{\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\sif\s(e.InnerException\sis\sSQLiteException\sex)\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s{\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\sConsole.WriteLine($"thr:\s{Thread.CurrentThread.ManagedThreadId}\sexception:\s{ex.Message}");\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\sthrow;\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s}\r\n\s\s\s\s\s\s\s\s\s\s\s\s}\r\n\r\n\s\s\s\s\s\s\s\s\s\s\s\sreturn\s1;\r\n\r\n\r\n\s\s\s\s\s\s\s\s}\r\n\r\n\r\n\s\s\s\s}\r\n\r\n\s\s\s\spublic\sclass\sApplicationDbContextInitializer\s:\sSqliteCreateDatabaseIfNotExists<ApplicationDbContext>\r\n\s\s\s\s{\r\n\s\s\s\s\s\s\s\spublic\sApplicationDbContextInitializer(DbModelBuilder\smodelBuilder)\r\n\s\s\s\s\s\s\s\s\s\s\s\s:\sbase(modelBuilder)\s{\s}\r\n\r\n\s\s\s\s\s\s\s\sprotected\soverride\svoid\sSeed(ApplicationDbContext\scontext)\r\n\s\s\s\s\s\s\s\s{\r\n\s\s\s\s\s\s\s\s\s\s\s\scontext.Configuration.ProxyCreationEnabled\s=\sfalse;\r\n\r\n\s\s\s\s\s\s\s\s}\r\n\s\s\s\s}\r\n\r\n\s\s\s\spublic\sclass\sMyTable\r\n\s\s\s\s{\r\n\s\s\s\s\s\s\s\s[Required]\r\n\s\s\s\s\s\s\s\spublic\sint\sId\s{\sget;\sset;\s}\r\n\r\n\s\s\s\s\s\s\s\s[MaxLength(10),\sRequired]\r\n\s\s\s\s\s\s\s\spublic\sstring\sStatus\s{\sget;\sset;\s}\r\n\r\n\s\s\s\s\s\s\s\s[MaxLength(10),\sRequired]\r\n\s\s\s\s\s\s\s\spublic\sString\sName\s{\sget;\sset;\s}\r\n\r\n\s\s\s\s\s\s\s\spublic\sDateTime\sLastEvaluatingTime\s{\sget;\sset;\s}\r\n\r\n\r\n\s\s\s\s}\r\n\r\n\r\n\s\s\s\sclass\sMyThread\r\n\s\s\s\s{\r\n\r\n\r\n\s\s\s\s\s\s\s\spublic\sstatic\svoid\sWorker()\r\n\s\s\s\s\s\s\s\s{\r\n\s\s\s\s\s\s\s\s\s\s\s\susing\s(var\sctxApp\s=\snew\sApplicationDbContext())\r\n\s\s\s\s\s\s\s\s\s\s\s\s{\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\swhile\s(true)\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s{\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\svar\sd\s=\sctxApp.MyTables.Where(r\s=>\sr.Status\s==\s"wait");\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\sforeach\s(var\sdataImport\sin\sd)\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s{\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s{\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\sdataImport.Status\s=\s"work";\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\sctxApp.SaveChanges();\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s}\r\n\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\svar\sa\s=\snew\sThread(new\sThreadWorker(dataImport.Id).Do)\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s{\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\sName\s=\s$"Importer\s{dataImport.Id}",\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\sPriority\s=\sThreadPriority.BelowNormal\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s};\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\sa.Start();\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s}\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s//Thread.Sleep(3000);\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s}\r\n\s\s\s\s\s\s\s\s\s\s\s\s}\r\n\s\s\s\s\s\s\s\s}\r\n\r\n\r\n\s\s\s\s\s\s\s\spublic\sstatic\svoid\stest(int\sid)\r\n\s\s\s\s\s\s\s\s{\r\n\s\s\s\s\s\s\s\s\s\s\s\swhile\s(true)\r\n\s\s\s\s\s\s\s\s\s\s\s\s{\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\susing\s(var\sctxApp\s=\snew\sApplicationDbContext())\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s{\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\sIEnumerable<MyTable>\sm\s=\sctxApp.MyTables.Where(r\s=>\sr.Id\s==\sid);\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\sif\s(m.Any())\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s{\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\sforeach\s(MyTable\smyTable\sin\sm)\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s{\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\smyTable.LastEvaluatingTime\s=\sDateTime.Now;\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\sThread.Sleep(100);\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\sctxApp.SaveChanges();\r\n\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s}\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s}\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s}\r\n\s\s\s\s\s\s\s\s\s\s\s\s}\r\n\s\s\s\s\s\s\s\s}\r\n\r\n\s\s\s\s}\r\n\r\n\s\s\s\spublic\sclass\sThreadWorker\r\n\s\s\s\s{\r\n\s\s\s\s\s\s\s\spublic\sint\sDimp\s{\sget;\s}\r\n\r\n\s\s\s\s\s\s\s\spublic\sThreadWorker(int\sdimp)\r\n\s\s\s\s\s\s\s\s{\r\n\s\s\s\s\s\s\s\s\s\s\s\sDimp\s=\sdimp;\r\n\s\s\s\s\s\s\s\s}\r\n\r\n\s\s\s\s\s\s\s\spublic\svoid\sDo()\r\n\s\s\s\s\s\s\s\s{\r\n\s\s\s\s\s\s\s\s\s\s\s\susing\s(var\sctxApp\s=\snew\sApplicationDbContext())\r\n\s\s\s\s\s\s\s\s\s\s\s\s{\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\sint\si\s=\s0;\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\svar\sd\s=\sctxApp.MyTables.Find(Dimp);\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\sfor\s(int\sj\s=\s0;\sj\s<\s10;\sj++)\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s{\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\sd.LastEvaluatingTime\s=\sDateTime.Now;\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\sctxApp.SaveChanges();\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\sThread.Sleep(100);\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s}\r\n\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\sd.Status\s=\s"wait";\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\sctxApp.SaveChanges();\r\n\s\s\s\s\s\s\s\s\s\s\s\s}\r\n\s\s\s\s\s\s\s\s}\r\n\s\s\s\s}\r\n\r\n\r\n\r\n\r\n\s\s\s\sclass\sProgram\r\n\s\s\s\s{\r\n\s\s\s\s\s\s\s\sstatic\svoid\sMyTest()\r\n\s\s\s\s\s\s\s\s{\r\n\s\s\s\s\s\s\s\s\s\s\s\sThread\sb\s=\snew\sThread(MyThread.Worker);\r\n\s\s\s\s\s\s\s\s\s\s\s\sb.Start();\r\n\s\s\s\s\s\s\s\s\s\s\s\sb.Join();\r\n\r\n\s\s\s\s\s\s\s\s}\r\n\r\n\s\s\s\s\s\s\s\sstatic\svoid\sTestOnlyUpdate()\r\n\s\s\s\s\s\s\s\s{\r\n\s\s\s\s\s\s\s\s\s\s\s\sThread\sb\s=\snew\sThread(()\s=>\sMyThread.test(1));\r\n\s\s\s\s\s\s\s\s\s\s\s\sb.Start();\r\n\s\s\s\s\s\s\s\s\s\s\s\sThread\sc\s=\snew\sThread(()\s=>\sMyThread.test(2));\r\n\s\s\s\s\s\s\s\s\s\s\s\sc.Start();\r\n\s\s\s\s\s\s\s\s\s\s\s\sb.Join();\r\n\s\s\s\s\s\s\s\s\s\s\s\sc.Join();\r\n\s\s\s\s\s\s\s\s}\r\n\r\n\r\n\s\s\s\s\s\s\s\sstatic\svoid\sMain(string[]\sargs)\r\n\s\s\s\s\s\s\s\s{\r\n\s\s\s\s\s\s\s\s\s\s\s\sString\sdb\s=\sPath.Combine(Environment.CurrentDirectory,\s"mydb.db");\r\n\s\s\s\s\s\s\s\s\s\s\s\sif\s(File.Exists(db))\sFile.Delete(db);\r\n\r\n\s\s\s\s\s\s\s\s\s\s\s\sSQLiteLog.Log\s+=\sSQLiteLog_Log;\r\n\s\s\s\s\s\s\s\s\s\s\s\sSQLiteLog.Enabled\s=\strue;\r\n\s\s\s\s\s\s\s\s\s\s\s\susing\s(var\sctxApp\s=\snew\sApplicationDbContext(false))\r\n\s\s\s\s\s\s\s\s\s\s\s\s{\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\sfor\s(int\si\s=\s0;\si\s<\s2000;\si++)\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s{\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\sctxApp.MyTables.Add(new\sMyTable()\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s{\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\sName\s=\s"a",\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\sStatus\s=\s"wait",\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\sLastEvaluatingTime\s=\sDateTime.Now\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s});\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s}\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\sctxApp.SaveChanges();\r\n\s\s\s\s\s\s\s\s\s\s\s\s}\r\n\r\n\s\s\s\s\s\s\s\s\s\s\s\sTestOnlyUpdate();\r\n\s\s\s\s\s\s\s\s\s\s\s\s\s//MyTest();\r\n\s\s\s\s\s\s\s\s}\r\n\r\n\s\s\s\s\s\s\s\sprivate\sstatic\svoid\sSQLiteLog_Log(object\ssender,\sLogEventArgs\se)\r\n\s\s\s\s\s\s\s\s{\r\n\s\s\s\s\s\s\s\s\s\s\s\sint\si\s=\s0;\r\n\s\s\s\s\s\s\s\s}\r\n\s\s\s\s}\r\n}
J login anonymous
J mimetype text/plain
J private_contact c3e20c3fd04683e5fb6438fe3caf27c67869f0c6
J severity Critical
J status Open
J title Database\sis\slocked
J type Incident
K 7698550f0fa6676dc9353dfc6d95a9c9d3ae8875
U anonymous
Z 28fb2645230bf45abc36f09aa82c9ac3