我想知道,在不隐式提交事务的情况下,是否存在锁定MySQL表的方法。
假设我有两个表(table_1,table_2),并将数据插入到这些表中,同时处理事务。我需要锁定'table_2‘,以便其他用户在事务完成之前不能写入/修改'table_2’。我的问题是,当我锁定table_2时,事务是隐式提交的。是的,我知道这在MySQL文档中有解释
锁表是事务安全的,并且在试图锁定表之前隐式地提交任何活动事务。
我想知道是否有任何其他事务安全的方法来进行表锁定。
这是我的C#代码段
MySQLTransaction trans = conn.BeginTransaction();
command.Transaction = trans;
command.CommandText = "INSERT INTO table_1 VALUES ('val1', 'val2')";
command.ExecuteNonQuery();
command.CommandText = "LOCK TABLES table_2 WRITE";
command.ExecuteNonQuery();
command.CommandText = "INSERT INTO table_2 VALUES ('val1', 'val2')";
command.ExecuteNonQuery();
command.CommandText = "RELEASE TABLES";
command.ExecuteNonQuery();
trans.Commit();是否可以在不提交事务的情况下锁定数据并将数据插入“table_2”?
提前感谢
发布于 2014-12-18 17:34:11
如果你想把实现这一目标的正确方法锁定在你的原意上,先把两张桌子都锁上:
LOCK TABLES table_1 WRITE, table_2 WRITE
INSERT INTO table_1 VALUES ('val1', 'val2')
INSERT INTO table_2 VALUES ('val1', 'val2')
UNLOCK TABLES本机MySQL提供了这种功能(虽然我从未测试过它是否会通过连接器工作--但不知道为什么不行)。
一旦你有了锁没人能进去。
发布于 2017-07-10 02:24:56
试试这个,用C#写的
using (var con = new MySqlConnection { ConnectionString = "YourConnectionString" })
{
con.Open();
MySqlTransaction trans = con.BeginTransaction();
MySqlCommand command = con.CreateCommand();
try
{
command.CommandText = @"LOCK TABLES table_1 WRITE, table_2 WRITE;
INSERT INTO table_1 VALUES ('val1', 'val2');
INSERT INTO table_2 VALUES ('val1', 'val2');
UNLOCK TABLES;";
command.ExecuteNonQuery();
trans.Commit();
}
catch(MySqlException ex)
{
trans.Rollback();
conn.msgErr(ex.Message + " sql query error.");
conn.msgErr("Neither record was written to database.");
}
finally
{
command.Dispose();
trans.Dispose();
}
}https://stackoverflow.com/questions/24157121
复制相似问题