Stange Behaivour With Activerecords And Restcontroller

Hello. I can’t understand next behavior which happens when I use ActiveRecords in RestController. I get this behavior in the next steps:

  1. POST /create

In actionCreate() I have something like next code:





    	$data = Yii::$app->getRequest()->getBodyParams();

    	// get other data from request ...


    	// check requested data ....


    	$model = new Bet();

    	$model->load($data, '');

    	$model->initializer_user_id = $this->currentUser->getId();

    	$model->create_datetime = date("Y-m-d H:i:s", time());       

    	// set other fields of the model

    	$model->save();




Then I saw next queries in the MySQL query log:





140724 14:56:05  1458 Connect   root@localhost on db

         		1458 Query 	SET NAMES 'utf8'

         		1458 Query 	SELECT * FROM `user` WHERE `facebook_access_token`='2'

         		1458 Query 	SHOW FULL COLUMNS FROM `user`

         		1458 Query 	SHOW CREATE TABLE `user`

         		1458 Query 	SHOW FULL COLUMNS FROM `bet`

         		1458 Query 	SHOW CREATE TABLE `bet`

         		1458 Query 	SELECT * FROM `bet`

         		.................................................................................................

         		1458 Query 	SELECT * FROM `event` WHERE `id`='1'

         		1458 Query 	SHOW FULL COLUMNS FROM `event`

         		1458 Query 	SHOW CREATE TABLE `event`

         		1458 Query 	SELECT 1 FROM `user` WHERE `id`='3'

         		1458 Query 	SELECT 1 FROM `user` WHERE `id`='2'

         		1458 Query 	SELECT 1 FROM `event` WHERE `id`='1'

         		1458 Query 	INSERT INTO `bet` (`event_id`, `opponent_user_id`, `initializer_user_id`, `create_datetime`, `opponent_status`, `winner`) VALUES ('1', '3', '2', '2014-07-24 09:56:05', 'pending', 'pending')

         		1458 Query 	SELECT * FROM `bet`

         		1458 Quit




All OK.

  1. I sent request: POST /delete/<id>

I write something like next code in the actionDelete($id) :




   	$bet = Bet::find()

        	->where([

            	'id'=>$id,

            	'initializer_user_id' => $this->currentUser->getId()

        	])->one();


    	// check data


    	$bet->delete()



Then I saw next queries in the MySQL query log:





140724 14:56:48  1459 Connect   root@localhost on db

         		1459 Query 	SET NAMES 'utf8'

         		1459 Query 	SELECT * FROM `user` WHERE `facebook_access_token`='2'

         		1460 Connect   root@localhost on betmedb

         		1460 Query 	SET NAMES 'utf8'

         		1460 Query 	SELECT * FROM `user` WHERE `facebook_access_token`='2'

         		1459 Query 	SHOW FULL COLUMNS FROM `user`

         		1460 Query 	SHOW FULL COLUMNS FROM `user`

         		1459 Query 	SHOW CREATE TABLE `user`

         		1460 Query 	SHOW CREATE TABLE `user`

         		1460 Query 	SELECT * FROM `bet` WHERE (`id`='129') AND (`winner`='pending') AND (`initializer_user_id`='2')

         		1460 Query 	SHOW FULL COLUMNS FROM `bet`

         		1459 Query 	SELECT * FROM `bet` WHERE (`id`='129') AND (`winner`='pending') AND (`initializer_user_id`='2')

         		1459 Query 	SHOW FULL COLUMNS FROM `bet`

         		1460 Query 	SHOW CREATE TABLE `bet`

         		1459 Query 	SHOW CREATE TABLE `bet`

         		1459 Query 	DELETE FROM `bet` WHERE (`id`='129') AND (`initializer_user_id`='2') AND (`opponent_user_id`='3') AND (`event_id`='1')

         		1460 Query 	DELETE FROM `bet` WHERE (`id`='129') AND (`initializer_user_id`='2') AND (`opponent_user_id`='3') AND (`event_id`='1')

         		1460 Quit

         		1459 Quit




As you can see, we get copy of all queries.

I think that this is wrong, but i can’t understand why Yii2 generates copy of all queries.

  1. I sent request: POST /create again.

Then I got next log:





140724 14:56:57  1461 Connect   root@localhost on betmedb

         		1461 Query 	SET NAMES 'utf8'

         		1461 Query 	SELECT * FROM `user` WHERE `facebook_access_token`='2'

         		1462 Connect   root@localhost on betmedb

         		1462 Query 	SET NAMES 'utf8'

         		1462 Query 	SELECT * FROM `user` WHERE `facebook_access_token`='2'

         		1461 Query 	SHOW FULL COLUMNS FROM `user`

         		1462 Query 	SHOW FULL COLUMNS FROM `user`

         		1461 Query 	SHOW CREATE TABLE `user`

         		1462 Query 	SHOW CREATE TABLE `user`

         		1461 Query 	SHOW FULL COLUMNS FROM `bet`

         		1462 Query 	SHOW FULL COLUMNS FROM `bet`

         		1461 Query 	SHOW CREATE TABLE `bet`

         		1462 Query 	SHOW CREATE TABLE `bet`

         		1462 Query 	SELECT * FROM `bet`

140724 14:56:58  1461 Query 	SELECT * FROM `bet`

         		1462 Query 	SELECT 1 FROM `bet` WHERE (`initializer_user_id`='2') AND (`opponent_user_id`='3') AND (`event_id`='1')

         		1461 Query 	SELECT 1 FROM `bet` WHERE (`initializer_user_id`='2') AND (`opponent_user_id`='3') AND (`event_id`='1')

         		1461 Query 	SELECT 1 FROM `bet` WHERE (`initializer_user_id`='2') AND (`opponent_user_id`='3') AND (`event_id`='1')

         		1462 Query 	SELECT 1 FROM `bet` WHERE (`initializer_user_id`='2') AND (`opponent_user_id`='3') AND (`event_id`='1')

         		1461 Query 	SELECT 1 FROM `bet` WHERE (`initializer_user_id`='2') AND (`opponent_user_id`='3') AND (`event_id`='1')

         		1462 Query 	SELECT 1 FROM `bet` WHERE (`initializer_user_id`='2') AND (`opponent_user_id`='3') AND (`event_id`='1')

         		1461 Query 	SELECT COUNT(*) FROM `bet` WHERE (`event_id`='1') AND (`initializer_user_id`='2') AND (`opponent_user_id`='3')

         		1462 Query 	SELECT COUNT(*) FROM `bet` WHERE (`event_id`='1') AND (`initializer_user_id`='2') AND (`opponent_user_id`='3')

         		1461 Query 	SELECT COUNT(*) FROM `bet` WHERE (`event_id`='1') AND (`initializer_user_id`='3') AND (`opponent_user_id`='2')

         		1462 Query 	SELECT COUNT(*) FROM `bet` WHERE (`event_id`='1') AND (`initializer_user_id`='3') AND (`opponent_user_id`='2')

         		1462 Query 	SELECT * FROM `event` WHERE `id`='1'

         		1461 Query 	SELECT * FROM `event` WHERE `id`='1'

         		1461 Query 	SHOW FULL COLUMNS FROM `event`

         		1461 Query 	SHOW CREATE TABLE `event`

         		1462 Query 	SHOW FULL COLUMNS FROM `event`

         		1461 Query 	SELECT 1 FROM `user` WHERE `id`='3'

         		1462 Query 	SHOW CREATE TABLE `event`

         		1461 Query 	SELECT 1 FROM `user` WHERE `id`='2'

         		1462 Query 	SELECT 1 FROM `user` WHERE `id`='3'

         		1461 Query 	SELECT 1 FROM `event` WHERE `id`='1'

         		1462 Query 	SELECT 1 FROM `user` WHERE `id`='2'

         		1461 Query 	INSERT INTO `bet` (`event_id`, `opponent_user_id`, `initializer_user_id`, `create_datetime`, `opponent_status`, `winner`) VALUES ('1', '3', '2', '2014-07-24 09:56:57', 'pending', 'pending')

         		1462 Query 	SELECT 1 FROM `event` WHERE `id`='1'

         		1462 Query 	INSERT INTO `bet` (`event_id`, `opponent_user_id`, `initializer_user_id`, `create_datetime`, `opponent_status`, `winner`) VALUES ('1', '3', '2', '2014-07-24 09:56:57', 'pending', 'pending')

         		1461 Query 	SELECT * FROM `bet`

         		1462 Query 	SELECT * FROM `bet`

         		1462 Quit

         		1461 Quit




We can see that Yii make copy of all queries again. Also, validation don’t apply and I get two identical rows(this is wrong, because I wrote validators for check this case).

Addition: This happens not only when we make steps in precise order.

If we make only "step 1"(send request POST /create) then remove directly from DB(for example via PhpMyAdmin) and make "step 1" again, then in some cases we get this strange behavior(when all queries are copied).

Ok. This is problem not related to ActiveRecords. This problem related to concurrent requests. I solved this problem by using Mutex for insert.