专栏首页码农二狗防止因事务未提交导致的死锁

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

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

相关文章

  • golang直接操作共享内存

    前一段时间使用公司内部某个依赖共享内存的组件,其go版本api通过cgo提供。抛开我是个pure go狂热分子以外,采用cgo的方式实现会存在很多问题。所以分析...

    码农二狗
  • 解决金字塔回调问题的两种手段

    码农二狗
  • 数据库事务隔离级别

    码农二狗
  • jQuery原理(DOM操作相关方法)

    删除所有的元素或指定元素。判断是否传入参数,如果传入参数,则删除指定元素,否则删除全部。

    Dreamy.TZK
  • 如何用JavaScript手动实现一个栈

    在生活中也能发现很多栈的例子。例如,厨房里堆放的盘子,总是叠在上方的先被使用;输入框内容进行删除时,总是最后输入的先删除;弹夹中的子弹,越后装入的,越先发射.....

    程序员宝库
  • JQuery实现双击编辑异步更新

    <script type="text/javascript"> $(function(){ $("tbody>tr>td").dblclick(funct...

    苦咖啡
  • 七、this

    我们在学习JavaScript的过程中,由于对一些概念理解得不是很清楚,但是又想要通过一些方式把它记下来,于是就很容易草率的给这些概念定下一些方便自己记忆的有偏...

    用户6901603
  • [第 3 期]JavaScript数据结构之数组栈队列

    桃翁

扫码关注云+社区

领取腾讯云代金券