[英]MySQL Table Locks with Transactions
我想知道有什么方法可以锁定MySQL表而无需隐式提交事务。
假设我有两个表(table_1,table_2),并且通过事务将数据同时插入到这些表中。 而且我需要锁定“ table_2”,以便其他用户在事务完成之前无法写入/修改“ table_2”。 我的问题是,当我锁定table_2时,隐式提交了事务。 是的,我知道它在MySQL文档中进行了解释
LOCK TABLES不是事务安全的,并且在尝试锁定表之前隐式提交任何活动事务
我想知道是否还有其他事务安全方法可以进行表锁定。
这是我的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”的想法?
提前致谢
如果您打算锁定实现此目标的正确方法,请提前锁定两个表:
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提供了此功能(尽管我从未测试过它是否可以通过连接器工作-但不知道为什么不行。)
拥有锁之后,任何人都无法进入。
试试用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();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.