Скорее всего движок БД не поддерживает транзакции. Надо поменять у таблиц engine с myisam на innodb
Напомню, что необходмо ловить \Exception, а не PDOException. Нам без разницы, какая именно ошибка прервала выполнение транзакции, откатываться надо в любом случае.
Плюс никогда нельзя забывать о логировании ошибок. То есть, вместо return false;, которое совсем ни о чем, лучше перевыбросить исключение, чтобы оно могло быть обработкно стандартным образом. В общем, читайте
правильные мануалы, там все есть :)