c#.net中的MySql事务

本文关键字:事务 MySql 中的 net | 更新日期: 2023-09-27 18:06:47

如何限制其他用户在某个事务开始后更新或插入表

我试过了:

MySqlConnection con = new MySqlConnection("server=localhost;database=data;user=root;pwd=;");
con.Open();
MySqlTransaction trans = con.BeginTransaction();
try
        {
            string sql = "insert INTO transaction_ledger (trans_id,voucher_id,voucher_number,trans_date,ledger_code,company_code,trans_type, trans_amount,primary_ledger,narration,ledger_parent,trans_type_name,ledger_ref_code,r_trans_id,IsSync) VALUES (0, 'EReceipt-4',4,'2013-04-01','483', '870d7d83-05ec-4fbb-8e9d-801150bd3ed1', 'EReceipt',-233.22,1,'asadfsaf','Bank OD A/c','Receipt','4274',1173,'N')";
            new MySqlCommand(sql, con, trans).ExecuteNonQuery();
            sql = "insert INTO transaction_ledger (trans_id,voucher_id,voucher_number,trans_date,ledger_code,company_code,trans_type, trans_amount,primary_ledger,narration,ledger_parent,trans_type_name,ledger_ref_code,r_trans_id,IsSync) VALUES (0, 'EReceipt-4',4,'2013-04-01','4274', '870d7d83-05ec-4fbb-8e9d-801150bd3ed1', 'EReceipt',100,0,'asadfsaf','Sundry Creditors','Receipt','483',1173,'N')";
            new MySqlCommand(sql, con, trans).ExecuteNonQuery();
            sql = "insert INTO transaction_ledger (trans_id,voucher_id,voucher_number,trans_date,ledger_code,company_code,trans_type, trans_amount,primary_ledger,narration,ledger_parent,trans_type_name,ledger_ref_code,r_trans_id,IsSync) VALUES (0, 'EReceipt-4',4,'2013-04-01','427', '870d7d83-05ec-4fbb-8e9d-801150bd3ed1', 'EReceipt',133.22,0,'asadfsaf','Sundry Creditors','Receipt','483',1173,'N')";
            new MySqlCommand(sql, con, trans).ExecuteNonQuery();

            trans.Commit();
        }
        catch (Exception ex)
        {
            trans.Rollback();
        }
        finally
        {
            con.Close();
        }

,但这仍然允许在BeginTransaction之后插入行。

c#.net中的MySql事务

BeginTransaction并不意味着"你的事务已经开始并且一切都被锁定"。它只是通知RDBMS关于您启动事务的意图,以及从现在开始您应该做的所有事情都应该并且必须被认为是原子的。

这意味着你可以调用BeingTransaction,我可以删除数据库中所有表中的所有数据,RDBMS会很乐意让我这样做。希望它不会让我放弃DB,因为您有一个打开的连接,然而,你永远不会知道这些天。可能有一些未记录的特性我没有意识到。

Atomic意味着任何操作或一组操作必须作为一个操作来执行。如果其中任何一个失败了,所有的都失败了。这是一个要么有要么没有的概念。

看起来您正在向表中插入三行。如果你的表是空的或者只有很少的行数,它可能会锁定整个表,这取决于你的RDBMS的lock ESCALATION规则。但是,如果它是一个大表或非常大的表或分区表,那么LOCK升级规则可能无法保证表锁。因此,多个事务仍有可能同时向表中插入行。这完全取决于RDBMS如何处理这种情况以及您的数据模型是如何构建的。

现在回答你的问题:

提示-在开始插入数据之前,寻找一种方法来锁定整个表。

然而,这通常是不好的,但我假设你有一个合理的理由这样做。