у меня возникают проблемы с поиском некоторых примеров, которые делают три из следующих вещей:Сырье SQL операции с golang подготовлены заявлениями
1) Разрешить сырую SQL транзакцию в golang.
2) Используйте подготовленные заявления.
3) Откат при сбоях запроса.
Я хотел бы сделать что-то подобное, но с подготовленными заявлениями.
stmt, stmt_err := db.Prepare(`
BEGIN TRANSACTION;
-- Insert record into first table.
INSERT INTO table_1 (
thing_1,
whatever)
VALUES($1,$2);
-- Inert record into second table.
INSERT INTO table_2 (
thing_2,
whatever)
VALUES($3,$4);
END TRANSACTION;
`)
if stmt_err != nil {
return stmt_err
}
res, res_err := stmt.Exec(
thing_1,
whatever,
thing_2,
whatever)
Когда я запускаю это, я получаю эту ошибку: pq: cannot insert multiple commands into a prepared statement
Что дает? Возможны ли совместимые с ACID транзакции в голанге? Я не могу найти пример.
EDIT нет примеров here.
Работает идеально. Спасибо чувак. – 1N5818
Действительно полезное сообщение, спасибо. Но я не понимаю, что «транзакция должна завершиться вызовом Commit или Rollback», когда вы возвращаете ошибку, вызванную 'tx.Prepare (некоторые sql ..)', вы не выполняете Commit или Rollback , Почему это? Является ли рассматриваемая сделка должным образом закрытой в этом сценарии? Несмотря на то, что в базовую базу данных не были внесены изменения, не нужно ли нам по-прежнему правильно закрывать транзакцию? – BARJ
Этот код неправильный для Go1.4 или более ранней версии, tx.Commit() освободит связанное с ним соединение обратно в пул, что произойдет до stmt.Close(), это может привести к параллельному доступу к базовому соединение, что делает состояние соединения непоследовательным. как указано здесь: http://go-database-sql.org/prepared.html –