• 阻止并发溢出


    <?php
    class Transaction {
        // 数据库连接对象
        public $link = null;
        function __construct() {
            $this->link = mysqli_connect ( '192.168.1.222', 'wedai', 'wedai', 'test' );
            mysqli_query ( $this->link, "set names 'UTF-8'" );
            mysqli_query ( $this->link, 'START TRANSACTION' );
        }
        
        // 并发测试
        function concurrent() {
            mysqli_query ( $this->link, "set session transaction isolation level read uncommitted" );
            // 设定延迟,单位微秒,1微秒等于百万分之一秒
            usleep ( rand ( 50, 500 ) );
            // 先查询一次
            $que = $this->selt1 ();
            // 库存大于0时允许减1
            if ($que ['storage_num'] > 0) {
                // 增加条件 WHERE storage_num > 0
                $sql = "UPDATE t1 SET storage_num = storage_num - 1 WHERE storage_num > 0";
                mysqli_query ( $this->link, $sql );
                // 再次查询
                $que = $this->selt1 ();
                if ($que ['storage_num'] >= 0) {
                    mysqli_query ( $this->link, "COMMIT" );
                    echo "减1成功";
                } else {
                    mysqli_query ( $this->link, "ROLLBACK" );
                    echo "减1失败";
                }
            }
        }
        //查询返回一条id=1的数据
        function selt1() {
            $sql = "SELECT * FROM t1 WHERE id = 1";
            $que = mysqli_query ( $this->link, $sql );
            return mysqli_fetch_array ( $que );
        }
    }
    header ( 'Content-type: text/html; charset=utf-8' );
    $ransaction = new Transaction ();
    $ransaction->concurrent ();
    ?>
  • 相关阅读:
    Java 8新特性探究(九)跟OOM:Permgen说再见吧
    Java 堆内存(Heap)[转]
    hashmap源码
    Java8学习笔记----Lambda表达式 (转)
    双重检查锁定与延迟初始化(转自infoq)
    kvm的live-snapshot
    8.25考试总结
    CF1151FSonya and Informatics
    CF1151div2(Round 553)
    BZOJ3728 PA2014Final Zarowki
  • 原文地址:https://www.cnblogs.com/dreamhome/p/4529023.html
Copyright © 2020-2023  润新知