首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >symfony2原则表锁

symfony2原则表锁
EN

Stack Overflow用户
提问于 2012-12-11 13:24:35
回答 1查看 3.7K关注 0票数 2

我不确定这是首选的方法,但我想给出我的解决方案,看看您的symfony2向导是否对此有一些有启发性的评论。

我在一个表中注册金融交易,每个用户都有自己的系列序列号(即每个用户的事务表将以1开头)。

我知道这必须由代码来处理,然后,如果假设两个人登录到同一个用户帐户注册事务,或者用户同时触发多个事务写入,而Doctrine在第一次写火之前在两个操作中执行选择,那么我就有可能为用户设置重复的条目.

代码语言:javascript
复制
        $em->getConnection()->exec('LOCK TABLES transaction WRITE;'); //lock for write access

            $results = $em->createQuery("SELECT MAX(t.serial) FROM ekonomiKassabokBundle:Transaction t WHERE t.user = $userId")->getResult();
            $temp = $results[0];
            $max_serial = $temp[1];
            $new_serial = $max_serial + 1;

            $entity->setSerial($new_serial);

            $em->persist($entity);
            $em->flush();

        $em->getConnection()->exec('UNLOCK TABLES;');

上面的密码给了我..。

代码语言:javascript
复制
SQLSTATE[HY000]: General error: 1100 Table 't0_' was not locked with LOCK TABLES

或者这可能是过火了,我应该跳过桌子锁吗?

EN

回答 1

Stack Overflow用户

发布于 2012-12-29 16:25:11

我终于找到了解决办法.是一个解决方案。

实际上,据我所知,这是非常愚蠢的:当您锁定表时,MySQL希望您使用所有的表,直到锁定为止,这必须在一个锁表语句中发生。

现在,Doctrine将系统地使用表别名,而MySQL显然无法确定别名指的是锁定的表。因此,你必须特别锁定所有的别名,将使用自己!

尝试:

代码语言:javascript
复制
$em->getConnection()->exec('LOCK TABLES transaction as t0_ WRITE;');

如果在此之后出现了另一个错误(如果您在表被锁定时执行了几个查询),只需继续向其他别名添加锁,例如:

代码语言:javascript
复制
$em->getConnection()->exec('LOCK TABLES transaction as t0_ WRITE, transaction as t0 WRITE, transaction as t1 WRITE;');

幸运的是,似乎教条总是使用相同的表别名,所以一旦你把它放下,它应该继续工作!

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

https://stackoverflow.com/questions/13821402

复制
相关文章

相似问题

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