在c#.net中的BeginTransaction MySql Transaction之后锁定表

时间:2013-04-01 18:56:55

标签: c# mysql database transactions

如何在特定交易开始后限制其他用户更新或插入表格?

我试过了:

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之后插入行。

1 个答案:

答案 0 :(得分:0)

BeginTransaction并不意味着“您的交易已经开始,一切都已锁定”。它只是告诉RDBMS您启动事务的意图,以及从现在开始应该做的所有事情都应该被认为是原子的。

这意味着你可以调用BeingTransaction,我可以删除数据库中所有表的所有数据,RDBMS很乐意让我这样做。希望它不应该让我放弃数据库因为你有一个开放的连接,但是,你现在都不知道。可能有一些我不知道的无证功能。

原子意味着任何行动或一系列行动必须一体行动。如果其中任何一个失败,则所有失败。这是一切或全无概念。

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

现在回答你的问题:

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

但是,这通常不好,但我假设你有合理的理由去做。

希望这有帮助。