防止因事务未提交导致的死锁

这周事儿比较多,遇到了不少问题.其中比较严重的就是因为在处理一个比较大的数据导入时为了保持数据一致性使用了事务,但是却因为脚本执行超时或者内存超出限制,导致了事务中断,然后数据库直接deadlock.

事后想了下,如果在自己的框架里面遇到了这样的问题如何解决呢?

自己框架里的数据库连接对象是重载了pdo,直接想到在析构函数里面判断当前是否在一个事务里面,如果是则回滚.

public function __destruct() {
    if ($this->inTransaction()) {
        $this->rollBack();
    }
}

实际情况是超时或者内存超出限制时php直接产生一个致命错误,析构函数是不会被执行的.

所以可以使用register_shutdown_function在构造时手工将析构函数注册进来:

public function __construct() {
    register_shutdown_function(array($this, '__destruct'));
}

ps:注意正常情况下会导致析构函数被执行2次

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程

PHP7 下的协程实现

前言 相信大家都听说过『协程』这个概念吧。 但是有些同学对这个概念似懂非懂,不知道怎么实现,怎么用,用在哪,甚至有些人认为yield就是协程! 我始终相信,如果...

3558
来自专栏码生

StackNavigator in react-navigation 传参

使用上面的方法即可进行参数传递 但是我建议当想下一个界面传参数时,使用唯一字段标识

971
来自专栏测试驿栈

Jmeter(七)_if控制器+循环控制器+计数器控制接口分支

最近查阅了一下网上关于if控制器的文章,大同小异,几乎找不到原创,于是决定自己写一篇

1.2K2
来自专栏吴伟祥

5个步骤,教你瞬间明白线程和线程安全

记得今年3月份刚来杭州面试的时候,有一家公司的技术总监问了我这样一个问题:你来说说有哪些线程安全的类?我心里一想,这我早都背好了,稀里哗啦说了一大堆。

1101
来自专栏同步博客

制作类似ThinkPHP框架中的PATHINFO模式功能(二)

  距离上一次发布的《制作类似ThinkPHP框架中的PATHINFO模式功能》(文章地址:http://www.cnblogs.com/phpstudy201...

775
来自专栏Java学习网

Java线程使用技巧学习(一)

Java线程使用技巧学习(一) Java线程有哪些不太为人所知的技巧与用法?   萝卜白菜各有所爱。像我就喜欢Java。学无止境,这也是我喜欢它的一个原因...

1896
来自专栏一枝花算不算浪漫

[Redis]Redis 概述及基本使用规范.

5098
来自专栏Java后端技术栈

Java多线程编程-(1)-线程安全和锁Synchronized概念

(1)在传统的操作系统中,程序并不能独立运行,作为资源分配和独立运行的基本单位都是进程。

893
来自专栏不会写文章的程序员不是好厨师

伪共享(False Sharing)和缓存行(Cache Line) 大杂烩

在上篇介绍LongAdder的文章中,我们最后留下了一个问题,为什么Cell中要插入很多个实际上并没有使用的Long变量?这个问题就得从False Sharin...

1521
来自专栏owent

libcopp更新 (merge boost 1.59 context)

这个框架的上下文部分是使用了boost.context,但是从开始写libcopp到现在,boost.context也更新了几个版本。而之前几次merge基本都...

882

扫码关注云+社区

领取腾讯云代金券