我想了解交易是如何运作的,但我认为我错过了一些东西。 我想开始在循环中添加一些行,当
i == 5
我想回滚事务时。
主要问题是它不回滚。
MySqlConnection conn2 = new MySqlConnection("server=127.0.0.1;uid=root;pwd=;database=dbtest;");
conn2.Open();
MySqlCommand command2 = conn2.CreateCommand();
MySqlTransaction trans;
trans = conn2.BeginTransaction();
command2.Transaction = trans;
try
{
for (int i = 0; i < 10; i++)
{
command2.CommandText = "INSERT INTO test (col1, col2, col3) VALUES ('1','1','1')";
command2.ExecuteNonQuery();
if (i == 5)
{
throw new Exception();
}
}
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
trans.Rollback();
}
我尝试在各个地方添加
SET autocommit = 0
和trans.Commit()
,但仍然不起作用。
然后我决定尝试一下MySQL数据库:
START TRANSACTION;
INSERT INTO test (col1, col2, col3) VALUES ('1','1','1')
//also with COMMIT here
ROLLBACK;
这也不起作用。我尝试阅读各种教程,我检查了官方 MySQL 页面的事务,但仍然没有进展。
也许您使用的MyISAM引擎不支持事务。 如果是这种情况你可以尝试将其更改为 InnoDB。
我有类似的问题,但是调用存储过程。 我在存储过程中创建了临时表 + 删除表。
https://dev.mysql.com/doc/refman/8.0/en/implicit-commit.html
CREATE TABLE 和 DROP TABLE 语句不会提交事务,如果 使用 TEMPORARY 关键字。
所以,我的愚蠢错误是我使用了没有 TEMPORARY 关键字的 DROP TABLE 。应该是:
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION;
CREATE TEMPORARY TABLE TempTable
(
Id BIGINT
);
UPDATE MyTable
SET Value = 1
WHERE Id = 1;
DROP TEMPORARY TABLE TempTable; <================
ROLLBACK;