Я модифицирую приложение для реализации блокировки строк в codeigniter. Я использовал MySQL для блокировки сериализуемой транзакции, которая работала как надо, когда я пытался в MySQL верстаке.
Но при попытке Codeigniter кажется, что ничего не происходит, другие пользователи все еще могут изменять данные в ряд. Я пытался изменить порядок транзакций и запросов вокруг, но, похоже, ничего не работает. База данных работает на Innodb.
Я пробовал несколько методов, включая приведенный ниже, который, очевидно, работает. Но нет блокировки строк, и я могу одновременно обновлять несколько windows.
/*
* Get id specified sales_order.
*
* @param int $sales_order_id - Sales_order ID.
* @return array - Return array of sales_order.
*
*/
public function get_sales_order($sales_order_id)
{
// Select DB.
$this->db->db_select($this->selected_db);
// Prepare query.
$sql = $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')
->from($this->selected_db . '.' . $this->table_name)
->join($this->selected_db . '.quotes AS quotes', 'quotes.id = sales_orders.quote_id', 'left')
->join($this->default_db . '.jobs AS jobs', 'jobs.id = sales_orders.job_id')
->where('sales_orders.id', $sales_order_id)
->get_compiled_select();
$this->db->reset_query();
//$this->db->set('autocommit = 0');
$this->db->query('SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;');
$this->db->trans_start();
// Process query and return row.
$data = $this->db->query("{$sql} FOR UPDATE");
return $data->row();
}