LoginSignup
9
9

More than 5 years have passed since last update.

ここ大事>トランザクション ロールバック時のオートナンバーフィールドの挙動について

Posted at

DBのトランザクションってそういうものでしょ?という認識はありつつも実際やったことがなかったので試してみました。
ここでの検証は、トランザクションをかけて、オートNO型のフィールドがどのように扱われるのか?を検証した結果です。

検証テーブル

今回以下のテーブルを検証につかってみました。ここで気にしているのは、id フィールドです。このフィールドは、AUTO_INCREMENTで設定されております

CREATE TABLE `test_ptable` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `updated_at` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'UTC-DATE',
  `domain` varchar(128) DEFAULT NULL COMMENT 'ex: www.yourdomain.com',
  PRIMARY KEY (`id`,`updated_at`)
) ENGINE=InnoDB AUTO_INCREMENT=8177590 DEFAULT CHARSET=utf8
/*!50500 PARTITION BY RANGE  COLUMNS(updated_at)
(PARTITION p20140901 VALUES LESS THAN ('2014-09-01') ENGINE = InnoDB,
 PARTITION p20141001 VALUES LESS THAN ('2014-10-01') ENGINE = InnoDB,
 PARTITION p20141101 VALUES LESS THAN ('2014-11-01') ENGINE = InnoDB) */

テーブルにインサートしてみる(ロールバックの挙動)

トランザクションをかけて、テーブルにインサートしてみます、ただしロールバックします

MariaDB [knowledge]> begin ;                                                                                                                                 
Query OK, 0 rows affected (0.00 sec)

MariaDB [knowledge]> insert into test_ptable (updated_at) values (current_timestamp) ;                                                                       
Query OK, 1 row affected (0.00 sec)

ロールバック前に、状態を確認

idに8177588が割りあたっています

MariaDB [knowledge]> select * from test_ptable ;                                                                                                             
+---------+---------------------+--------+
| id      | updated_at          | domain |
+---------+---------------------+--------+
| 8177588 | 2014-10-09 20:17:28 | NULL   |
+---------+---------------------+--------+
1 row in set (0.00 sec)

ロールバックします

MariaDB [knowledge]> rollback ;
Query OK, 0 rows affected (0.03 sec)

ロールバック後の状態

当たり前ですが、データはないです

MariaDB [knowledge]> select * from test_ptable ;
Empty set (0.00 sec)

テーブルにインサートしてみる(トランザクションをかけない)

ここで、重要なことは、再度インサートを試みた時に、前回ロールバックした際のidを再びもってこないよね?というところです

さっそくインサートします

こんどは、オートコミットです

MariaDB [knowledge]> insert into test_ptable (updated_at) values (current_timestamp) ;
Query OK, 1 row affected (0.00 sec)

インサートの結果

MariaDB [knowledge]> select * from test_ptable ;
+---------+---------------------+--------+
| id      | updated_at          | domain |
+---------+---------------------+--------+
| 8177589 | 2014-10-09 20:18:06 | NULL   |
+---------+---------------------+--------+
1 row in set (0.00 sec)

おぉおお、、よかった、前回ロールバック前に取得したid 8177588 は欠番になり、新たに8177589が割当たりました!!!!

とりあえず、安心???

9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9