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

这周事儿比较多,遇到了不少问题.其中比较严重的就是因为在处理一个比较大的数据导入时为了保持数据一致性使用了事务,但是却因为脚本执行超时或者内存超出限制,导致了事务中断,然后数据库直接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 条评论
登录 后参与评论

相关文章

来自专栏数据科学与人工智能

【Spark研究】Spark编程指南(Python版)

Spark编程指南 译者说在前面:最近在学习Spark相关的知识,在网上没有找到比较详细的中文教程,只找到了官网的教程。出于自己学习同时也造福其他初学者的目的,...

7455
来自专栏java思维导图

值得收藏!Redis五大数据类型应用场景(一)

Redis开创了一种新的数据存储思路,使用Redis,我们不用在面对功能单调的数据库时,把精力放在如何把大象放进冰箱这样的问题上,而是利用Redis灵活多变的数...

1274
来自专栏AILearning

Apache Spark 2.2.0 中文文档 - Spark 编程指南 | ApacheCN

Spark 编程指南 概述 Spark 依赖 初始化 Spark 使用 Shell 弹性分布式数据集 (RDDs) 并行集合 外部 Data...

2266
来自专栏牛肉圆粉不加葱

[Spark源码剖析]Task的调度与执行源码剖析

一个Spark Application分为stage级别和task级别的调度,stage级别的调度已经用[DAGScheduler划分stage]和[DAGSc...

722
来自专栏Laoqi's Linux运维专列

初识Redis

1203
来自专栏简单聊聊Spark

Spark内核分析之Shuffle操作流程(非常重要)

        如题,我们来分析一下spark的shuffle操作原理;为什么说其非常重要,是因为shuffle操作是我们在Spark调优中非常重要的一环,对s...

953
来自专栏CSDN技术头条

基于Zookeeper的分布式锁

实现分布式锁目前有三种流行方案,分别为基于数据库、Redis、Zookeeper的方案,其中前两种方案网络上有很多资料可以参考,本文不做展开。我们来看下使用Zo...

2248
来自专栏MYSQL轻松学

Percona XtraDB Cluster

image.png 1、什么是Percona XtraDB Cluster Percona XtraDB Cluster是一个开源,免费的MySQL高可用工具....

29710
来自专栏java相关

Memcached相关内容总结

Memcached使用Slab Allocator机制分配和管理内存,这种分配机制可以减少内存碎片的产生,减轻系统管理内存的负担。

843
来自专栏Albert陈凯

4.4 共享变量

4.4 共享变量 一般来说,当一个被传递给Spark操作(例如,Map和Reduce)的函数在一个远程集群上运行时,该函数实际上操作的是它用到的所有变量的独立...

32212

扫码关注云+社区