精华内容
下载资源
问答
  • 发现问题最近在补以前数据的时候程序突然报如下错误:[2017-02-10 13:12:06.678] [INFO] mysqlLog - update tbl_playerdata_error: { [Error: ER_LOCK_DEADLOCK: Deadlock found when trying to get lock;...

    发现问题

    最近在补以前数据的时候程序突然报如下错误:

    [2017-02-10 13:12:06.678] [INFO] mysqlLog - update tbl_playerdata_error: { [Error: ER_LOCK_DEADLOCK: Deadlock found when trying to get lock; try restarting transaction]

    code: 'ER_LOCK_DEADLOCK',

    errno: 1213,

    sqlState: '40001',

    index: 0 }

    一看就是mysql出现了死锁问题,其实上面跑的程序在测试服跑了好久都没什么问题,为什么在正式服上会出现mysql的死锁问题呢,第一反应是不是数据量太大(3百多万条),可是也不可能啊,再说死锁和这些有什么鸡毛的关系,看来要好好解决下了。

    问题分析

    我的分析是:由于现在处理的是正式服的数据,而正式服还有许多用户在操作,应该是在用户查询,或者是其他操作的时候,和我这边的数据更新产生了死锁(首先说明使用的是:InnoDB存储引擎。由于用户那边的查询或者其他操作锁定了我需要的资源,而我这边更新也锁定了用户操作的一部分资源,两边都等着对方释放资源,从而导致死锁)。

    解决方法

    知道错误code之后,先来查看mysql的说明,关于上面的 Error: 1213 SQLSTATE: 40001,参见:Server Error Codes and Messages

    Message: Deadlock found when trying to get lock; try restarting transaction

    InnoDB reports this error when a transaction encounters a deadlock and is automatically rolled back so that your application can take corrective action. To recover from this error, run all the operations in this transaction again. A deadlock occurs when requests for locks arrive in inconsistent order between transactions. The transaction that was rolled back released all its locks, and the other transaction can now get all the locks it requested. Thus, when you re-run the transaction that was rolled back, it might have to wait for other transactions to complete, but typically the deadlock does not recur. If you encounter frequent deadlocks, make the sequence of locking operations (LOCK TABLES, SELECT ... FOR UPDATE, and so on) consistent between the different transactions or applications that experience the issue. See Section 14.8.5, “Deadlocks in InnoDB” for details.

    上面有两句:

    To recover from this error, run all the operations in this transaction again
    If you encounter frequent deadlocks, make the sequence of locking operations (LOCK TABLES, SELECT ... FOR UPDATE, and so on)
    consistent between the different transactions or applications that experience the issue

    这两句也就道出了处理死锁的方法了,我就是在死锁错误发生的时候,使用定时器再重新做一次更新操作,这样就避免了上面出现的问题。

    另外,参考了stack overflow上面一个回答:http://stackoverflow.com/questions/2332768/how-to-avoid-mysql-deadlock-found-when-trying-to-get-lock-try-restarting-trans

    One easy trick that can help with most deadlocks is sorting the operations in a specific order.

    You get a deadlock when two transactions are trying to lock two locks at opposite orders, ie:

    connection 1: locks key(1), locks key(2);

    connection 2: locks key(2), locks key(1);

    If both run at the same time, connection 1 will lock key(1), connection 2 will lock key(2) and each connection will wait for the other to release the key -> deadlock.

    Now, if you changed your queries such that the connections would lock the keys at the same order, ie:

    connection 1: locks key(1), locks key(2);

    connection 2: locks key(1), locks key(2);

    it will be impossible to get a deadlock.

    So this is what I suggest:

    Make sure you have no other queries that lock access more than one key at a time except for the delete statement. if you do (and I suspect you do), order their WHERE in (k1,k2,..kn) in ascending order.

    Fix your delete statement to work in ascending order:

    Change

    DELETE FROM onlineusers WHERE datetime <= now() - INTERVAL 900 SECOND

    To

    DELETE FROM onlineusers WHERE id IN (SELECT id FROM onlineusers

    WHERE datetime <= now() - INTERVAL 900 SECOND order by id) u;

    Another thing to keep in mind is that mysql documentation suggest that in case of a deadlock the client should retry automatically. you can add this logic to your client code. (Say, 3 retries on this particular error before giving up).

    参考:http://blog.sina.com.cn/s/blog_4acbd39c01014gsq.html

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

    展开全文
  • 常规方法使用 isset 加以判断2. PHP7 可以使用 ?? (NULL 合并操作符)3. Laravel 5.5 及以上可以使用 optional 辅助函数4. 使用 object_get 辅助函数5. 使用 data_get 辅助函数 场景 public function res() { $...

    场景

    public function res()
    { 
        $user = User::where('id',1)->first();
        return $user->avatar->url;
    }
    

    在这里插入图片描述
    如果 $user->avatarnull 或者不存在,就会引起 (E_ERROR) Trying to get property 'url' of non-object错误。

    1. 常规方法是使用 isset 加以判断

    if(isset($user->avatar->url))
        return $user->avatar->url;
    else
        return 'defaultUrl';
    

    如果在 blade 模板的 echo 中,可以使用:

    {{ $user->avatar->url or 'defaultUrl' }}
    

    2. PHP7 可以使用 ?? (NULL 合并操作符)

    // 如果 $user->avatar->url 为 null, 返回 'defaultUrl'
    return $user->avatar->url ?? 'defaultUrl';
    

    3. Laravel 5.5 及以上可以使用 optional 辅助函数

    optional函数可以接受任何参数,并且允许你访问该对象的属性或者调用方法。如果给定的对象是 null, 那么属性和方法会简单地返回 null 而不是产生一个错误:

    # 如果给定的对象是 null , 那么属性和方法会简单地返回 null 而不是产生一个错误:
    return optional($user->avatar)->url;
    

    Laravel 5.7 中,optional 函数还可以接受 匿名函数 作为第二个参数:

    /**
     * 如果第一个参数不为 null, 则调用闭包
     * 详见 https://laravel\com/docs/5.7/helpers#method-optional
     */
    return optional(User::find($id), function ($user) {
        return new DummyUser;
    });
    

    4. 使用 object_get 辅助函数

    return object_get($user->avatar, 'url', 'default');
    

    这个函数原意是用来已. 语法来获取对象中的属性,例如:

    return object_get($user, 'avatar.url', 'default');
    

    也可以达到避免 non-object 错误的效果。

    if (! function_exists('object_get')) {
        /**
         * Get an item from an object using "dot" notation.
         *
         * @param  object  $object
         * @param  string  $key
         * @param  mixed   $default
         * @return mixed
         */
        function object_get($object, $key, $default = null)
        {
            if (is_null($key) || trim($key) == '') {
                return $object;
            }
    
            foreach (explode('.', $key) as $segment) {
                if (! is_object($object) || ! isset($object->{$segment})) {
                    return value($default);
                }
    
                $object = $object->{$segment};
            }
    
            return $object;
        }
    }
    

    5. 使用 data_get 辅助函数

    return data_get($user, 'avatar.url', 'default');
    

    return data_get($user, ['avatar', 'url'], 'default');
    

    .语法来获取对象属性或数组元素。

    if (! function_exists('data_get')) {
        /**
         * Get an item from an array or object using "dot" notation.
         *
         * @param  mixed   $target
         * @param  string|array  $key
         * @param  mixed   $default
         * @return mixed
         */
        function data_get($target, $key, $default = null)
        {
            if (is_null($key)) {
                return $target;
            }
            $key = is_array($key) ? $key : explode('.', $key);
            while (! is_null($segment = array_shift($key))) {
                if ($segment === '*') {
                    if ($target instanceof Collection) {
                        $target = $target->all();
                    } elseif (! is_array($target)) {
                        return value($default);
                    }
                    $result = [];
                    foreach ($target as $item) {
                        $result[] = data_get($item, $key);
                    }
                    return in_array('*', $key) ? Arr::collapse($result) : $result;
                }
                if (Arr::accessible($target) && Arr::exists($target, $segment)) {
                    $target = $target[$segment];
                } elseif (is_object($target) && isset($target->{$segment})) {
                    $target = $target->{$segment};
                } else {
                    return value($default);
                }
            }
            return $target;
        }
    }
    
    展开全文
  • 接下来是我今天上午遇到的问题和解决方法。 之前成功的使用nginx反向代理实现了浏览器跨域访问。但是本地重新启动一个nginx服务来解决跨域问题显然并不是最优解。 于是今天尝试使用angular/cli中自带的webpack....

            最近在学习angular2框架,感叹angular出现的bug解决起来有点难(bushi),主要是国内使用angular较少,百度不出来,Google的话倒是能给点提示,但是英文看着很不舒服。这段纯属吐槽。接下来是我今天上午遇到的问题和解决方法。

            之前成功的使用nginx反向代理实现了浏览器跨域访问。但是本地重新启动一个nginx服务来解决跨域问题显然并不是最优解。

            于是今天尝试使用angular/cli中自带的webpack.proxy.server进行proxy反向代理来解决浏览器跨域问题。

    根据网上的文章,配置流程大概是:

            1.创建proxy.config.json,配置要跨域访问的接口

    {
      "/api-81": {
        "target": "http://81.70.233.131:3000",
        "secure": false,
        "logLevel": "debug",
        "changeOrigin": true,
        "pathRewrite": {
          "^/api-81": ""
        }
      },
      "/api-163": {
        "target": "https://c.m.163.com",
        "logLevel": "debug",
        "changeOrigin": true,
        "secure": false,
        "pathRewrite": {
          "^/api-163": ""
        }
      }
    }

            2.在angular.json 中添加项

    "proxyConfig": "proxy.config.json"

            3.在package.json 中做如下修改

    "start": "ng serve  --proxy-config proxy.config.json",

             4.通过如下地址访问并重启项目

           [HPM] Error occurred while trying to proxy request 错误

             整个流程配置结束之后发现,浏览器端可以正常运行,但是并没有Console.log任何信息。观察控制台,报如下错误。 

    [HPM] Error occurred while trying to proxy request 
    /ug/api/wuhan/app/data/list-total from localhost:4200 to
     https://c.m.163.com (ETIMEDOUT) 
    (https://nodejs.org/api/errors.html#errors_common_system_errors)
    
    [HPM] Error occurred while trying to proxy request
     /api-81/getTeacherList from localhost:4200 to 
    http://81.70.233.131:3005 (ECONNRESET) 
    (https://nodejs.org/api/errors.html#errors_common_system_errors)
    

            这里是webpack.proxy.server抛出的错误,我们可以从node_modules中找出这个服务器配置代码并做一点修改,来抛出更加详细的错误以便于我们解决问题。

            webpack.proxy.server 在/node_modules/http-proxy-middleware/lib/index.js,找到其中关于错误抛出的代码,将详细错误抛出。

    //node_modules/http-proxy-middeleware/lib/index.js  错误函数
    ...
      function logError(err, req, res) {
        var hostname =
          (req.headers && req.headers.host) || (req.hostname || req.host) // (websocket) || (node0.10 || node 4/5)
        var target = proxyOptions.target.host || proxyOptions.target
        var errorMessage =
          '[HPM] Error occurred while trying to proxy request %s from %s to %s (%s) (%s)'
        var errReference =
          'https://nodejs.org/api/errors.html#errors_common_system_errors' // link to Node Common Systems Errors page
        logger.error("---------> 打印详细错误代码<---------") //添加的代码
        logger.error(err)        //添加的代码
        logger.error(
          errorMessage,
          req.url,
          hostname,
          target,
          err.code || err,
          errReference
        )
      }
    }
    ....

     修改之后,报错信息为:

            socket hang up,顾名思义,socket连接断开。这个错误是nodejs也就是proxy.server抛出的。说明和后台连接不成功(超时)。出现这种情况有一种可能是因为后台服务器设置的断开时间较短,而数据又较大。

            而在这里,数据包并不大,且多个连接均超时。说明本地存在问题。而连接超时很大一部分问题出在网络质量上。

            我的网络连接的是公司的内网,对外网的访问有限制。因此nginx和这里的反向代理服务器都无法私自访问外网。这也是本错误的最终原因。

    最终原因:

            内网导致反向代理服务器无法连接对应接口,时间达到后抛出超时的错误。

    解决方法:

            更换网络连接。我这里直接换成个人热点,问题马上解决。

    返回的结果

             思考:在nginx尝试反向代理的时候曾经遇到的这个内网限制的问题,所以这次只用了一个上午查找(bushi)。在进行网络相关的测试的时候,除了配置项以外,也要注意本地网络连接的影响。重要的是锁定问题出现的位置,体现在代码上就是根据抛出错误提示来思考和改正。

    展开全文
  • 出现问题的场景: 多线程大批量插入(涉及到唯一索引, 没有插入 有则更新) ...解决方法有两种: 添加test_id+group_id的组合索引,这样就可以避免掉index merge; 将优化器的index merge优化关闭; 加锁 ...

    出现问题的场景: 多线程大批量插入(涉及到唯一索引, 没有插入 有则更新)

    出现问题的原因:在某些情况下,当两个索引都希望检索 1 行时,UPDATE 查询使用索引合并。这种行为增加了死锁的机会。

     锁争抢问题

    https://bugs.mysql.com/bug.php?id=77209

    解决方法有两种:

    • 添加test_id+group_id的组合索引,这样就可以避免掉index merge;
    • 将优化器的index merge优化关闭;
    • 出现锁争抢的sql语句所在的代码块加锁
    展开全文
  • 1.使用事务,但是避免使用长事务,将大事务拆小,分段多提交。 2.sql语句条件字段添加上主键或者索引,这样执行后为行锁,避免表锁,从而避免死锁。
  • Angular本地中转报错:[HPM] Error occurred while trying to proxy request 代理配置 在前端开发中了,为了解决浏览器跨域问题,一般都会使用 webpack 的 devServer.proxy 功能,来中转接口。 根据 Angular 的文档,...
  • 遂报错“RuntimeError: Trying to create tensor with negative dimension” 解决 百度上面看不到几条信息(英文渣),不负有心人,找到一个能稍微看明白的,链接 程序中报错在这个地方: s_q = torch.cat((s_q, ...
  • 使用PyCharm调试程序为其添加断点,运行后控制台提示 pydev debugger: warning: trying to add breakpoint to file that does not exist 造成这样的原因是之前为部分文件设置过断点但一直没有取消 解决方法 Run-&...
  • 今天测试反馈了个刷屏的警告”Particle System is trying to spawn on a mesh with zero surface area“根据翻译判断是使用了体积为0的mesh,但是当我在网上查找资料的时候,网上说的是因为 ParticleSystem 中 ...
  • 原因是conda源加入了不知名的URL,现在不能使用了(或者废弃) 但我已经是重新装的anconda,配置也是清华源, 按照这个链接装的 安装教程 按我安装包还是遇到bug ,有些包能装上,有些装不上,然我我就上官网查方法...
  • 文章目录Glide使用背景使用方式一:into传入ImageView分析1:scaleType=fitXY是否会导致trying to use a recycled bitmap异常?分析2:into传入imageView是否会导致trying to use a recycled bitmap异常?使用方式二...
  • 你也可以尝试使用Unix命令hdparm的禁用磁盘写入硬件缓存的缓存,或使用对特定硬件供应商的一些其他命令。 解决方案 可以采取以下步骤从损坏中恢复: 当MySQL被关闭,通过复制所有数据库文件创建备份。 这是非常重要...
  • 写在前面:本次问题的核心是在事务检索和操作时没有使用索引,数据库使用了表锁,导致操作时间过长,从而使锁占用时间过长,最终导致死锁。 环境: 数据库:MySQL 5.7 存储引擎:InnoDB (1).定位问题 进入数据库命令行...
  • 关闭redis时,出现(error) ERR Errors trying to SHUTDOWN. Check logs的解决 报错内容: 学redis不久,今天关闭客户端的时候总给我显示这个错误,现在已经解决了,写个文章记录一下,同时希望给一些初学的盆友一点...
  • ES 创建太多 buckets 错误: trying to create too many buckets. must be less than or equal to: [100000] but was [100001].
  • 问题的出现在于我在循环里使用了如下的更新z1的公式, z1是通过 z1 = cal(t0,z0,t1,z1,z2) 得到的,这里z1是已经定义了的变量,但是经过这个公式又把z1更新覆盖了,虽然说这个错误可以在最后loss....
  • 我这里实际是调用了一个zend的数据库访问的方法使用了fetchAll方法,但由于数据库中没有该记录,所以返回的对象是null,所以我就判断对象是否为null:if($obj==null){...}这么写的结果,就是产生了上面那个notice,...
  • 解决:SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame 在使用pandas时遇到了一个问题:SettingWithCopyWarning: A value is trying to be set on ...解决方法就是使用loc
  • 使用docker-compose从私有仓库拉取镜像时报如下的错: Pulling jetlinks (registry.cn-shenzhen.aliyuncs.com/XXX/XXX)... ERROR: The image for the service you're trying to recreate has been removed. If you...
  • 问题:在多访问的情况下,一个删除计划的操作会出现死锁现象,... Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transac...
  • 使用链式操作的时候,例如:return $user->avatar->url;如果 $user->avatar 为 null,就会引起 (E_ERROR) Trying to...1. 常规方法使用 isset 加以判断:if(isset($user->avatar->url))return $u...
  • 环境为ubantu 14。 gcc编译 .c 文件时正常,编译 .cpp 文件时报错。 原因: 解决方法
  • centos中安装gcc后编译程序出现提示:gcc: error trying to exec 'cc1': execvp: 没有该文件或目录的错误 以前在ubuntu或者mint中都是执行sudo apt-get install build-essential来解决,现在找到一种手动安装的方法...
  • 使用官方脚本安装: get docker 安装完之后,出现问题: sky@sky-X450CC:~$ docker image ls Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get ...
  • 本地安装CentOS7_DVD,调通了网络,确认可以正常上网,但在分别使用yum安装软件时,都出现了以下报错: [Errno 14] HTTPS Error 302 - Found Trying other mirror. 其实是yum源的配置有问题 解决方法: 登录root...
  • 代码: order.rename({'info_id':'order_id'},inplace=True) order_detail1 = detail1.join(order,...解决方法发现 发现order[‘order_id’]和detail1[‘order_id’]的类型是object,将其转换成int类型就可以了 修改: o
  • try restarting transaction的解决方法》要点:本文介绍了Mysql实例mysql报错:Deadlock found when trying to get lock; try restarting transaction的解决方法,希望对您有用。如果有疑问,可以联系...
  • 使用opensmile提取语音特征,...解决方法 打开MATLAB,本人使用的是MATLAB R2021A 在MATLAB中输入有问题的语音 将有问题语音从新写入新的文件中,其中,44100是音频信号的取样率,视情况填写,此三项都是必填。 ...
  • 在写Hfile的时候 ,如果一个family下超过了默认的32个hfile,就会报如下错误:ERROR mapreduce.LoadIncrementalHFiles: Trying to load more than hfiles to family d of region with start keyException in thread ...
  • 行级锁 行级锁在使用的时候并不是直接锁掉这行记录,而是锁索引 如果一条sql用到了主键索引(mysql主键自带索引),mysql会锁住主键索引; 如果一条sql操作了非主键索引,mysql会先锁住非主键索引,再锁定主键索引. 什么...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 56,484
精华内容 22,593
关键字:

trying的用法