Regarding atomic database operations, etc. This is what happens to an import process when a 'joplin sync' is triggered in the background.
It's unclear whether the "ERROR" is actually an error, or if the import process is retrying, or if a DELETE is actually failing (and potentially leaving something inconsistent):
Error: Error: SQLITE_BUSY: database is locked: INSERT INTO `note_tags` (`note_id`, `tag_id`, `updated_time`, `user_updated_time`, `id`, `created_time`, `user_created_time`) VALUES (?, ?, ?, ?, ?, ?, ?): 65982470864b43d1ab2e0d034f44e649,864e84baa5ef4dfca7d47a86035eae3d,1603993373023,1603993373023,5e5e6d57862c4cd193fa965ac820129a,1603993373023,1603993373023
at DatabaseDriverNode.sqliteErrorToJsError (/Users/someuser/.joplin-bin/lib/node_modules/joplin/lib/database-driver-node.js:21:18)
at JoplinDatabase.sqliteErrorToJsError (/Users/someuser/.joplin-bin/lib/node_modules/joplin/lib/database.js:25:24)
at JoplinDatabase.tryCall (/Users/someuser/.joplin-bin/lib/node_modules/joplin/lib/database.js:104:45)
at processTicksAndRejections (node:internal/process/task_queues:93:5)
at async JoplinDatabase.transactionExecBatch (/Users/someuser/.joplin-bin/lib/node_modules/joplin/lib/database.js:161:4)
at async Function.save (/Users/someuser/.joplin-bin/lib/node_modules/joplin/lib/BaseModel.js:503:4)
at async Function.addNote (/Users/someuser/.joplin-bin/lib/node_modules/joplin/lib/models/Tag.js:64:18)
at async saveNoteTags (/Users/someuser/.joplin-bin/lib/node_modules/joplin/lib/import-enex.js:198:3)
at async saveNoteToStorage (/Users/someuser/.joplin-bin/lib/node_modules/joplin/lib/import-enex.js:225:22)
at async processNotes (/Users/someuser/.joplin-bin/lib/node_modules/joplin/lib/import-enex.js:345:21) {
code: 'SQLITE_BUSY'
}
/Users/someuser/.joplin-bin/lib/node_modules/joplin/lib/database-driver-node.js:21
const output = new Error(msg.join(': '));
^
Error: Error: SQLITE_BUSY: database is locked: DELETE FROM item_changes WHERE item_id = ?: 9896f891caef4ecc9a932985d0b191ee
at DatabaseDriverNode.sqliteErrorToJsError (/Users/someuser/.joplin-bin/lib/node_modules/joplin/lib/database-driver-node.js:21:18)
at JoplinDatabase.sqliteErrorToJsError (/Users/someuser/.joplin-bin/lib/node_modules/joplin/lib/database.js:25:24)
at JoplinDatabase.tryCall (/Users/someuser/.joplin-bin/lib/node_modules/joplin/lib/database.js:104:45)
at processTicksAndRejections (node:internal/process/task_queues:93:5)
at async JoplinDatabase.transactionExecBatch (/Users/someuser/.joplin-bin/lib/node_modules/joplin/lib/database.js:173:5)
at async Function.add (/Users/someuser/.joplin-bin/lib/node_modules/joplin/lib/models/ItemChange.js:25:4) {
code: 'SQLITE_BUSY'
}