Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

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が割当たりました!!!!

とりあえず、安心???

hit
なんとなくデータベースエンジニア。なんとなくメモしてます
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away