同一サーバーの異なる DB 間でトランザクションは有効か

mysql> CREATE DATABASE `a`;
Query OK, 1 row affected (0.02 sec)

mysql> CREATE DATABASE `b`;
Query OK, 1 row affected (0.00 sec)

mysql> USE `a`;
Database changed
mysql> CREATE TABLE `test` (
    ->     `id` INT(11) NOT NULL AUTO_INCREMENT,
    `data` VARCHAR(64) NULL,
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    ->     `create_time` TIMESTAMP NOT NULL,

    `data` VARCHAR(64) NULL,
    ->     `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    ->     PRIMARY KEY (`id`)
    `create_time` TIMESTAMP NOT NULL,
    ->
    ->     PRIMARY KEY (`id`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.05 sec)

mysql> USE `b`;
Database changed
mysql> CREATE TABLE `test` (
    ->     `id` INT(11) NOT NULL AUTO_INCREMENT,
    `data` VARCHAR(64) NULL,
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    ->     `create_time` TIMESTAMP NOT NULL,

    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;    `data` VARCHAR(64) NULL,
    ->     `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    ->     `create_time` TIMESTAMP NOT NULL,
    ->
    ->     PRIMARY KEY (`id`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.03 sec)
<?php

$a = new PDO('mysql:host=localhost; dbname=a', 'root', '');

$a->beginTransaction();
$a->exec('INSERT `a`.`test` (`data`, `create_time`) VALUES ("hoge", NOW())');
$a->exec('INSERT `b`.`test` (`data`, `create_time`) VALUES ("fuga", NOW())');
$state = $a->query('SELECT `data` FROM `a`.`test`');
var_dump($state->fetchColumn());
$state = $a->query('SELECT `data` FROM `b`.`test`');
var_dump($state->fetchColumn());
$a->rollBack();
$state = $a->query('SELECT `data` FROM `a`.`test`');
var_dump($state->fetchColumn());
$state = $a->query('SELECT `data` FROM `b`.`test`');
var_dump($state->fetchColumn());
  • 実行結果
string(4) "hoge"
string(4) "fuga"
bool(false)
bool(false)