Следующего код является небезопасным (или, по крайней мере, я предполагаю, что это такое):комбинируя используя операторы и замки
using (SQLiteConnection connection = new SQLiteConnection("path")) {
MyTableCreationHelper.CreateTable(connection, "tableName"));
}
Проблема заключается в том, что если другой поток пытается создать таблицу на другое подключение к тому же пути , база данных будет заблокирована, поэтому будет выбрано исключение. Чтобы предотвратить это, я могу сделать следующее:
object lockObject = myLockHelper.GetUniqueObjectForLocking("path"); //does what it claims to do; implementation not shown
lock (lockObject) {
using (SQLiteConnection connection = new SQLiteConnection("path")) {
MyTableCreationHelper.CreateTable(connection, "tableName"));
}
}
Теперь код безопасен, но и clunkier, как я должен обернуть используя в замке каждый раз. Мой вопрос в том, есть ли способ объединить использование и блокировку, чтобы сделать его менее неуклюжим?
В идеале это было бы сделано так, чтобы это не зависело от того, что наша внутренняя операция включает в себя SQLiteConnection. Другими словами, запись блокировки для SQLiteConnection является решением, отличным от идеала, потому что если в следующий раз моя блокировка не будет включать SQLite, проблема будет повторяться.
Вместо того чтобы помещать блокировку, я думаю, вы должны написать try-catch внутри 'using (var connection = new ...) {'. Попробуйте создать таблицу, и если она выдает исключение, вы знаете, что таблица уже существует. Еще лучше использовать нечто вроде 'If (tableExists)' добавить строки в таблицу, иначе создать его. – displayName
Вы уверены, что база данных будет метать, для разных «tableName»? Кажется, что-то, что было бы легко сериализуемо. –
Он меня бросил. Я не уверен, почему - он был пойман на общем уровне, где это уже не было очевидным. –