C# MySQL 事务不起作用

问题描述 投票:0回答:2

我想了解交易是如何运作的,但我认为我错过了一些东西。 我想开始在循环中添加一些行,当

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 页面的事务,但仍然没有进展。

c# mysql transactions
2个回答
1
投票

也许您使用的MyISAM引擎不支持事务。 如果是这种情况你可以尝试将其更改为 InnoDB。


0
投票

我有类似的问题,但是调用存储过程。 我在存储过程中创建了临时表 + 删除表。

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;
© www.soinside.com 2019 - 2024. All rights reserved.