什么是最好的方式(我需要)把事务性围绕这个c# MySQL数据访问代码

本文关键字:事务性 代码 访问 数据 MySQL 方式 什么 | 更新日期: 2023-09-27 18:17:47

把事务性放在下面的c#数据库读取代码访问MySQL数据库的最好方法是什么?也许更重要的问题是"是否有必要在单读语句中加入事务性"

    public List<Item> RunQuery(DateTime runDate)
    {
        var connection = new MySqlConnection(CONNECTION_STRING);
        connection.Open();
        string query = "select * from MyTable order by name";
        var cmd = new MySqlCommand(query, connection);
        MySqlDataReader myReader = cmd.ExecuteReader();
        var items = new List<Item>();
        try
        {
            while (myReader.Read())
            {
                items.Add(new Item
                {
                    Name = myReader.GetString("name"),
                    Date = myReader.GetDateTime("date")
                });
            }
        }
        finally
        {
            myReader.Close();
            connection.Close();
        }
        return items;
    }

什么是最好的方式(我需要)把事务性围绕这个c# MySQL数据访问代码

正如Nitin Midha所提到的,当您只读取数据时,或者即使您的代码更新数据但只有一次数据库访问(即调用为您执行插入,更新或删除的SP),也不需要使用事务。话虽如此,事务应该尽可能地原子化,因此它们应该在第一次数据库更新访问之前和最后一次数据库更新访问之后立即创建。如果它在try catch块中,您可以在try之前定义de transaction变量,然后在try中需要时打开它,然后在catch部分询问transaction != null,如果是则回滚。提交将在try块中。

例如:

        DbTransaction tx = null;
        try
        {
            tx = Connection.CreateTransaction();
            Connection.ExecuteNonQuery(tx, "SPNameOrSQLInstruction", new object[] { param1, param2 });
            tx.Commit();
        }
        catch (Exception ex)
        {
            if(tx != null)
                tx.Rollback();
            Logger.Log (ex);
        }