Откат транзакции с MySQL Connector в VB.net - PullRequest
3 голосов
/ 20 апреля 2010

У меня есть один многострочный оператор INSERT (около 300 наборов значений), который я хотел бы зафиксировать в базе данных MySQL способом «все или ничего».

insert into table VALUES
(1, 2, 3),
(4, 5, 6),
(7, 8, 9);

В некоторых случаях набор значений в команде не будет соответствовать критериям таблицы (например, дубликат ключа). Когда это произойдет, я не хочу, чтобы какой-либо из предыдущих наборов был добавлен в базу данных. Я реализовал это с помощью следующего кода, однако моя команда отката, похоже, не имеет значения. Я использовал эту документацию: http://dev.mysql.com/doc/refman/5.0/es/connector-net-examples-mysqltransaction.html

Dim transaction As MySqlTransaction = sqlConnection.BeginTransaction()
sqlCommand = New MySqlCommand(insertStr, sqlConnection, transaction)
Try
    sqlCommand.ExecuteNonQuery()
Catch ex As Exception
    writeToLog("EXCEPTION: " & ex.Message & vbNewLine)
    writeToLog("Could not execute " & sqlCmd & vbNewLine)
    Try
        transaction.Rollback()
        writeToLog("All statements were rolled back." & vbNewLine)
        Return False
    Catch rollbackEx As Exception
        writeToLog("EXCEPTION: " & rollbackEx.Message & vbNewLine)
        writeToLog("All statements were not rolled back." & vbNewLine)
        Return False
    End Try
End Try
transaction.commit()

Я получаю исключение DUPLICATE KEY, исключение Rollback Exception и каждый набор значений вплоть до дубликата ключа, зафиксированного в базе данных. Что я делаю не так?

1 Ответ

3 голосов
/ 20 апреля 2010

Используете ли вы таблицы MyISAM (по умолчанию)? MyISAM не поддерживает транзакции. Используйте InnoDB таблицы, если вам нужны транзакции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...