@Muxauko

Горутино-безопасное обоащение к sqlite3?

Помогите разобраться с многопоточным обращением к БД.
Не могу понять суть. Прошу на примере кода.
Как понимаю, при помощи sql.Open я получаю объект получения, через который в люьой горутине чтение с базы могу производить без ограничений и запись. Но когда приходит момент изменить одно и то же значение или прочесть то, что должно измениться...Нагуглил что можно через mutex, но разве mutex-ом например через db.Exec я не заблочу сам пулл(объект соединения)? Не могу понять как мютексом организовать запись, изменение. Допустим в базе данных имеется 4 таблицы. Сервер читает с трех таблиц и отправляет данные клиенту. Другой клиент делает запрос, что ведет к изменению данных определенного поля в 2 таблицах. Третий клиент тоже делает запрос, который приведет к изменению данных в 1 из 4 таблиц...Как мне этим мютексом орудовать на деле с sqlite3
  • Вопрос задан
  • 467 просмотров
Пригласить эксперта
Ответы на вопрос 2
uvelichitel
@uvelichitel Куратор тега Go
habrahabr.ru/users/uvelichitel
Если вы работаете с sql консистентность данных гарантируется и обеспечивается движком базы через механизм транзакций. Транзакции отражены в пакете database/sql из стандартной библиотеки https://golang.org/pkg/database/sql/#Tx Ничего особенного на уровне языка делать вообще нет необходимости, просто не обращайтесь к одной транзакции из нескольких горутин.
Ответ написан
@falconandy
Можно ограничить максимальное кол-во соединений до 1:
db.SetMaxOpenConns(1)
Это приведет к тому, что и запросы на чтение перестанут выполняться параллельно - так что может подойти, если у вас запросы "шустрые".
Плюс в том, что в коде не надо будет ничего менять, никаких мьютексов.
Но так как у вас мест записи в БД немного, то можно использовать и мьютексы - вряд ли вы что-то упустите.
Если бы мест изменения БД было много, то еще можно рассмотреть вариант обертки над *sql.DB, в которой автоматически использовать мьютекс для всех "подозрительных" методов - например Exec методов (из предположения что в них как правило идет изменение БД) или Query методов, если в запросе есть insert, update или delete.

Вот еще ссылка по теме: https://stackoverflow.com/questions/35804884/sqlit...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы