0

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

我试过这个:

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

4

1 回答 1

0

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

这意味着您可以调用 BeingTransaction,我可以从您的数据库中的所有表中删除所有数据,RDBMS 会很乐意让我这样做。希望它不应该让我放弃数据库,因为你有一个开放的连接,但是,这些天你永远不知道。可能有一些我不知道的未记录功能。

原子意味着任何动作或一组动作都必须作为一个动作来执行。如果其中任何一个失败了,那么他们都失败了。这是一个有或无的概念。

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

现在回答你的问题:

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

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

希望这可以帮助。

于 2013-04-14T06:11:11.733 回答