如何在特定交易开始后限制其他用户更新或插入表格?
我试过了:
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之后插入行。
答案 0 :(得分:0)
BeginTransaction并不意味着“您的交易已经开始,一切都已锁定”。它只是告诉RDBMS您启动事务的意图,以及从现在开始应该做的所有事情都应该被认为是原子的。
这意味着你可以调用BeingTransaction,我可以删除数据库中所有表的所有数据,RDBMS很乐意让我这样做。希望它不应该让我放弃数据库因为你有一个开放的连接,但是,你现在都不知道。可能有一些我不知道的无证功能。
原子意味着任何行动或一系列行动必须一体行动。如果其中任何一个失败,则所有失败。这是一切或全无概念。
看起来你要在表格中插入三行。如果您的表为空或行数非常少,则可能会锁定整个表,具体取决于RDBMS的LOCK ESCALATION规则。但是,如果它是大型或非常大或分区的表,则LOCK升级规则可能无法保证表锁定。因此,多个事务可能仍然可以同时在表中插入行。这完全取决于RDBMS如何处理这种情况以及数据模型的结构。
现在回答你的问题:
提示 - 在开始插入数据之前,寻找一种锁定整个表的方法。
但是,这通常不好,但我假设你有合理的理由去做。
希望这有帮助。