MySQL表锁与事务

时间:2014-06-11 07:34:20

标签: c# mysql 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'?

提前致谢

2 个答案:

答案 0 :(得分:0)

如果您打算按照正确的意图锁定正确的方法,请事先锁定两个表:

LOCK TABLES table_1 WRITE, table_2 WRITE
INSERT INTO table_1 VALUES ('val1', 'val2')
INSERT INTO table_2 VALUES ('val1', 'val2')
UNLOCK TABLES

Native MySQL提供了这个(虽然我从未测试它是否可以通过连接器工作 - 但不知道为什么不这样做。)

一旦你有了锁,没有人可以进入。

答案 1 :(得分:0)

试试这个,用C#编写

>>> shuffle_by_two("hello world")
'hello wolrd'
>>> shuffle_by_two("hello world")
'hello wolrd'
>>> shuffle_by_two("hello world")
'ehllo owrld'
>>> shuffle_by_two("hello world")
'ehllo world'
>>> shuffle_by_two("hello world")
'hello owlrd'
>>> shuffle_by_two("hello world")
'ehll oowrld'
>>>