繁体   English   中英

MySQL表锁与事务

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM