首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有事务的MySQL表锁定

问带有事务的MySQL表锁定
EN

Stack Overflow用户
提问于 2014-06-11 07:34:20
回答 2查看 2.6K关注 0票数 1

我想知道,在不隐式提交事务的情况下,是否存在锁定MySQL表的方法。

假设我有两个表(table_1,table_2),并将数据插入到这些表中,同时处理事务。我需要锁定'table_2‘,以便其他用户在事务完成之前不能写入/修改'table_2’。我的问题是,当我锁定table_2时,事务是隐式提交的。是的,我知道这在MySQL文档中有解释

锁表是事务安全的,并且在试图锁定表之前隐式地提交任何活动事务。

我想知道是否有任何其他事务安全的方法来进行表锁定。

这是我的C#代码段

代码语言:javascript
复制
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”?

提前感谢

EN

回答 2

Stack Overflow用户

发布于 2014-12-18 17:34:11

如果你想把实现这一目标的正确方法锁定在你的原意上,先把两张桌子都锁上:

代码语言:javascript
复制
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提供了这种功能(虽然我从未测试过它是否会通过连接器工作--但不知道为什么不行)。

一旦你有了锁没人能进去。

票数 0
EN

Stack Overflow用户

发布于 2017-07-10 02:24:56

试试这个,用C#写的

代码语言:javascript
复制
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();
            }

        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24157121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档