在Codeigniter中设置可串行化的事务隔离吗?

问题描述 投票:-1回答:1

我正在修改应用程序以在codeigniter中实现行锁定。我使用MySQL做一个可序列化的事务锁,当我在MySQL工作台中尝试时,该锁应能正常工作。

但是当尝试使用Codeigniter时,似乎什么也没发生,其他用户仍然可以修改行中的数据。我尝试过更改事务和查询的顺序,但是似乎没有任何效果。该数据库在Innodb上运行。

        public function get_sales_order($sales_order_id)
{

    // Select DB.
    $this->db->db_select($this->selected_db);

    $this->db->query('SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;');
    $this->db->query('SET autocommit = 0;');

    $this->db->trans_start();

    // Prepare query.
    $this->db->select('sales_orders.id,
                      sales_orders.job_id,
                      sales_orders.invoice_id,
                      sales_orders.quote_id,
                      sales_orders.consignee_id,
                      sales_orders.carrier_id,
                      sales_orders.carrier_account_number,
                      sales_orders.delivery_instructions,
                      sales_orders.outwards_type,
                      sales_orders.reference_number,
                      sales_orders.pick_reference,
                      sales_orders.order_number,
                      sales_orders.client_reference,
                      sales_orders.date_posted,
                      sales_orders.date_required,
                      sales_orders.status,
                      sales_orders.shipping_method,
                      sales_orders.notes,
                      sales_orders.total_weight_ordered,
                      sales_orders.total_cubic_ordered,
                      sales_orders.total_units_ordered,
                      sales_orders.total_weight_picked,
                      sales_orders.total_cubic_picked,
                      sales_orders.total_units_picked,
                      sales_orders.total_cartons,
                      sales_orders.total_outers,
                      sales_orders.total_pallets,
                      sales_orders.uniform_pallets_picked,
                      sales_orders.pick_time_taken,
                      sales_orders.hoist_unloads,
                      sales_orders.total_labels,
                      sales_orders.plastic_sleeves,
                      sales_orders.shrink_wrap,
                      sales_orders.total_straps,
                      sales_orders.pallet_repacking,
                      sales_orders.carton_repacking,
                      sales_orders.is_urgent,
                      sales_orders.is_backorder,
                      sales_orders.is_picked,
                      sales_orders.is_packed,
                      sales_orders.is_shipped,
                      sales_orders.is_invoiced,
                      sales_orders.is_finalised,
                      sales_orders.is_cancelled,
                      sales_orders.amount_subtotal,
                      sales_orders.amount_discount,
                      sales_orders.amount_gst,
                      sales_orders.amount_total,
                      sales_orders.picked_by,
                      sales_orders.cancelled_by,
                      sales_orders.datetime_expected_pickup,
                      sales_orders.datetime_pick_started,
                      sales_orders.datetime_pick_completed,
                      sales_orders.datetime_finalised,
                      jobs.reference_number AS job_number,
                      quotes.reference_number AS quote_number');

    $this->db->from($this->selected_db . '.' . $this->table_name);

    $this->db->join($this->selected_db . '.quotes AS quotes', 'quotes.id = sales_orders.quote_id', 'left');
    // Join to retrieve job reference number.
    $this->db->join($this->default_db . '.jobs AS jobs', 'jobs.id = sales_orders.job_id');

    $this->db->where('sales_orders.id', $sales_order_id);

     //Process query and return row.
    $query = $this->db->get();


    return $query->row();
}
php mysql codeigniter
1个回答
0
投票

您也必须​​结束事务,否则mysql等到超时。

正在运行的交易

要使用交易记录来运行查询,您将使用$ this-> db-> trans_start()和$ this-> db-> trans_complete()函数

Documentation

所以简单地添加

$this->db->trans_complete();
© www.soinside.com 2019 - 2024. All rights reserved.