Size: a a a

Golang Developers — русскоговорящее сообщество

2021 April 15

А

Анатолий in Golang Developers — русскоговорящее сообщество
можешь перефразировать?
источник

АО

Александр Орешкин... in Golang Developers — русскоговорящее сообщество
Сейчас попробую.
источник

А

Анатолий in Golang Developers — русскоговорящее сообщество
можно с транзакцией и можно без
и вопрос зачем транзакция если можно без нее сделать запрос?
источник

A

Andrew in Golang Developers — русскоговорящее сообщество
Нельзя делать запросы без транзакций. Простой query создаёт для одной команды транзакций и сам её закрывает по завершению.
источник

АО

Александр Орешкин... in Golang Developers — русскоговорящее сообщество
Подождите) Сейчас сформулирую правильно.
источник

A

Andrew in Golang Developers — русскоговорящее сообщество
Смысл транзакции в том, что база данных выполняет транзакции попорядку. И если каждый запрос делать в отдельной транзакции, то получится, что для каждой команды у бд разное состояние (т.к. в бд могут писать другие участники).

Транзакция позволяет сгруппировать команды и выполнить их все попорядку так, чтобы другие юзеры не повлияли на твой результат.

Уфф, понимаю что кривой объяснил 😅
источник

АО

Александр Орешкин... in Golang Developers — русскоговорящее сообщество
Вот вариант с транзакцией где мы создаем, откатываем и закрываем ее.

func BookService(conn *pgxpool.Pool) error {
 tx, err := conn.Begin(context.Background())
 if err != nil {
   return err
 }

 defer tx.Rollback(context.Background())

 _, err = tx.Query(context.Background(), "select * from books")
 if err != nil {
   return err
 }

 err = tx.Commit(context.Background())
 if err != nil {
   return err
 }

 return nil
}
источник

АО

Александр Орешкин... in Golang Developers — русскоговорящее сообщество
Вот вариант без транзакции, так же закрываем после себя соединение.

func BookService(conn *pgxpool.Pool) error {
 rows, err := conn.Query(context.Background(), "select * from books")
 if err != nil {
   return err
 }
 defer rows.Close()

 return nil
}
источник

A

Andrew in Golang Developers — русскоговорящее сообщество
На википедии есть определение транзакции, чтобы понятно было, что это такое
источник

A

Andrew in Golang Developers — русскоговорящее сообщество
Тут под капотом та же транзакция
источник

АО

Александр Орешкин... in Golang Developers — русскоговорящее сообщество
Задача получить список книг из бд.
Какую цель тут может приследовать транзакция и как вообще правильно работать с запросами в бд)))
источник

А

Анатолий in Golang Developers — русскоговорящее сообщество
зачем нужны транзакции:
пришел запрос
пишем в базу пользователя
получаем айди его
пишем в базу профиль пользовтаеля <- тут пмы получили ошибку
пишем в базу последние изменения в истории пользовтеля <- это так же не запишется в базу

теперь у нас есть неконсистентные данные, часть данных записана а часть нет

а теперь представь что это был не просто мусор о входе пользователя а какая-то информация о банковском счете и операциях с деньгами, неприкольно если часть не запишется

чтоб обезопасить себя от таких вещей, оборачиваешь все в транзакцию и все запросы выполняются в ней
если хоть один запрос отвалился, то вообще все запросы откатыавются и ты возвращаешься к изначальному варианту, либо все проходят и у тебя 100% все запросы прошли

Если у тебя один запрос, использовать транзакцию не нужно
источник

AS

Alexey Shatunov in Golang Developers — русскоговорящее сообщество
нельзя просто взять книги, надо взять читательский билет, заполнить, подойти к полке, убедиться что книгу уже кто-то взял, вычеркнуть ее в читательском билете и пойти искать злодея который книгу взял, но назад не вернул
источник

АО

Александр Орешкин... in Golang Developers — русскоговорящее сообщество
1 запрос от одного клиента?
источник

А

Анатолий in Golang Developers — русскоговорящее сообщество
1 запрос к базе данных который ни с чем не связан
источник

А

Анатолий in Golang Developers — русскоговорящее сообщество
ты просто записал новую книгу в список книг
источник

А

Анатолий in Golang Developers — русскоговорящее сообщество
если запрос не пройдет, ты никакиз связанных данных не потеряешь, пользователю покажешь ошибку и он попробует еще раз
источник

А

Анатолий in Golang Developers — русскоговорящее сообщество
а если при этом тебе нужно добавить +1 в книжную полку?
источник

А

Анатолий in Golang Developers — русскоговорящее сообщество
если один из запросов не пройдет у тебя на полке будет 10 книг а на самом деле 11
источник

АО

Александр Орешкин... in Golang Developers — русскоговорящее сообщество
Если 1000 пользователей делают по запросу, то они в очереди, и если у одного пользователя вылетит ошибка, то остальные пользователи тоже получат отказ?
источник