如何使用codeigniter锁定表?

时间:2012-07-18 12:17:13

标签: mysql codeigniter locking

我必须在模型中运行这个sql例程:

$this->db->query('LOCK TABLE orders WRITE');
$this->db->query('TRUNCATE TABLE orders');
$this->db->query('INSERT INTO orders SELECT * FROM orders_tmp');
$this->db->query('UNLOCK TABLES');

但是我收到了这个错误:

  

错误号码:1192
      无法执行请求的命令:锁定表或事务运行
的表       TRUNCATE TABLE命令

我在这张桌子上使用MyISAM作为数据库引擎。

你能帮我吗?

3 个答案:

答案 0 :(得分:1)

要在无法进行并发插入时对表real_table执行许多INSERT和SELECT操作,可以将行插入临时表temp_table,并定期使用临时表中的行更新实际表。这可以使用以下代码完成:

mysql> LOCK TABLES real_table WRITE, temp_table WRITE;

请问它是否对您不起作用。

答案 1 :(得分:1)

试试这个

$this->db->query('TRUNCATE TABLE orders');
$this->db->query('LOCK TABLE orders WRITE');
$this->db->query('INSERT INTO orders SELECT * FROM orders_tmp');
$this->db->query('UNLOCK TABLES');

答案 2 :(得分:1)

您需要获取查询中所有表的锁定,而不仅仅是您要写入的表格。因此,在您的情况下,您还需要@Html.AntiForgeryToken() <div class="form-horizontal"> @Html.ValidationSummary(true, "", new { @class = "text-danger" }) <div class="form-group"> @Html.LabelFor(model => model.email, htmlAttributes: new {@class = "control-label col-md-12", style="text-align: left; padding-left: 30px;"}) <div class="col-md-12" align="center"> @Html.EditorFor(model => model.email, new {htmlAttributes = new {@class = "form-control", id = "emailTxt"}}) @Html.ValidationMessageFor(model => model.email, "", new {@class = "text-danger"}) </div> </div> <div class="form-group"> @Html.LabelFor(model => model.NewsletterType, htmlAttributes: new { @class = "control-label col-md-12", style = "text-align: left; padding-left: 30px;" }) <br /> <div class="col-md-12" align="center"> @Html.EnumDropDownListFor(model => model.NewsletterType, new { @class = "form-control" }) @Html.ValidationMessageFor(model => model.NewsletterType, "", new { @class = "text-danger", id = "ddlType" }) </div> </div> <div class="form-group"> <div class="col-md-offset-4 col-md-10" style="padding-bottom: 10px;"> <button type="button" class="btn btn-success btn-newsletter"></button> </div> </div> </div> <script> $(function(){ var model = { email: $('.emailTxt').text(); NewsletterType: $('.ddlType :selected').text(); } $(.btn-newsletter).click(function(){ $.ajax({ url: url, type: 'POST', data: model, beforeSend: function(xhr){xhr.setRequestHeader('__RequestVerificationToken', $('body').find('input[name="__RequestVerificationToken"]'));}, statusCode: { 200: function (data) { success(data); }, 500: function (erro) { error(erro); } } }); }); }); </script> 上的读锁定。

来自文档:

  

需要锁定的会话必须在单个LOCK TABLES语句中获取所需的所有锁定。在保持这样获得的锁的同时,会话只能访问锁定的表

文档:https://dev.mysql.com/doc/refman/5.5/en/lock-tables.html

干杯