¿Está utilizando tablas InnoDB o tablas MyISAM? MySQL no admite transacciones en tablas MyISAM (pero no le dará un error si intenta usarlas). Además, asegúrese de que su nivel de aislamiento de transacciones esté configurado correctamente, debe ser SERIALIZABLE, que no es el valor predeterminado para MySQL.
Este artículo tiene un buen ejemplo que explica el impacto de los diferentes niveles de aislamiento usando un ejemplo muy similar al tuyo.