Yes, you can implement that inside your env.py if you wanted.    All the
other processes would wait and once inside the lock they all need to
re-check the version.    Not something alembic would include, though.

On Tuesday, April 26, 2016, Amit Saha <amitsaha...@gmail.com> wrote:

> On Wed, Apr 27, 2016 at 12:37 AM, Mike Bayer <mike...@zzzcomputing.com
> <javascript:;>> wrote:
> >
> >
> > On 04/26/2016 01:22 AM, Amit Saha wrote:
> >>
> >> On Tue, Apr 26, 2016 at 12:33 PM, Mike Bayer <mike...@zzzcomputing.com
> <javascript:;>>
> >> wrote:
> >>>
> >>>
> >>>
> >>> On 04/25/2016 08:30 PM, Amit Saha wrote:
> >>>>
> >>>>
> >>>> Hi all,
> >>>>
> >>>> In my scenario, DB migrations (via alembic) will be run as part of the
> >>>> app deployment and multiple app deployments will happen near
> >>>> simultaneously (multiple EC2 instances talking to the same MySQL DB).
> >>>> Let's, for simplicity's sake assume two instances:
> >>>>
> >>>> Instance #1: Alembic sees alembic_version table and finds that we do
> >>>> need the migrations to happen, and starts the migration.
> >>>>
> >>>> Instance #2: Alembic sees alembic_version table and finds that we do
> >>>> need the migrations to happen, and starts the migration.  This doesn't
> >>>> obviously happen since MySQL will lock the table during the migration.
> >>>
> >>>
> >>>
> >>> this scenario is entirely unsupported.   MySQL does not support
> >>> transactional DDL and migration #1 will be hitting some tables and
> >>> migration
> >>> #2 another.    The version table is not updated until after a
> particular
> >>> migration takes place so concurrent processes will both be doing the
> same
> >>> migration at the same time.
> >>>
> >>>>
> >>>> Now, let's say instance #1 finishes the migration first and updates
> the
> >>>> alembic_version table. Then, the migration triggered by instance #2
> >>>> starts to run, and errors out because the schema changes are already
> in
> >>>> place.
> >>>>
> >>>> Is this what will happen or does alembic get a read/write lock on
> >>>> alembic_version table for the entire migration?
> >>>
> >>>
> >>>
> >>> there are no "read/write locks" on the alembic_version table.  What
> >>> you're
> >>> doing will not work at all.   Only one process should be running
> >>> migrations
> >>> against a single target database at a time.
> >>
> >>
> >> Thanks for the reply, Mike. I am wondering what are my options -
> >> should I just have to ensure that I don't run migrations in more than
> >> one process? Which would mean, I cannot really use alembic for my DB
> >> migrations (I wonder how people would usually do it).
> >
> >
> > How this is usually done is that the decision to "migrate" is initiated
> > manually.  I'm guessing this is a web application that wants to just
> > automigrate when it starts.    Usually what apps like that do is check
> that
> > the DB is not up to date, and present a web form with a button to
> "upgrade"
> > - so the user pushes the button only once.    Or, if this is some kind of
> > service that spawns multiple processes, the lead process does the check
> > against the table and does the upgrade.
> >
> > The thing about schema upgrades is that they require code changes to have
> > any upgrades to apply.  So therefore, you're starting *something* to
> first
> > run that new code; that's where the migration step should happen, before
> > everything else starts up.
>
> Thanks again Mike. So, I think the manual separate step to change the
> schema has to be in there.
>
> For my curiosity's sake (and please bear with my noobishness), what if
> alembic had a lock (provided the RDMS allows) for the entire time:
>
> 1. Get RW lock on alembic_version
> 2. Check if we need a migration
> 3. Yes, next step, no- step 5
> 4. Run migrations
> 5. Update alembic_version
> 5. Release lock on alembic_version
>
> That would at least prevent multiple migrations stepping on each
> other's feet? Whichever gets to alembic_version first performs the
> entire migration and when the other process gets to alembic_version,
> it finds no migrations are needed.
>
>
>
>
> >
> >
> >
> >
> >
> >>
> >
> > --
> > You received this message because you are subscribed to a topic in the
> > Google Groups "sqlalchemy-alembic" group.
> > To unsubscribe from this topic, visit
> >
> https://groups.google.com/d/topic/sqlalchemy-alembic/I2AAEUdF2dQ/unsubscribe
> .
> > To unsubscribe from this group and all its topics, send an email to
> > sqlalchemy-alembic+unsubscr...@googlegroups.com <javascript:;>.
> > For more options, visit https://groups.google.com/d/optout.
>
>
>
> --
> http://echorand.me
>
> --
> You received this message because you are subscribed to the Google Groups
> "sqlalchemy-alembic" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to sqlalchemy-alembic+unsubscr...@googlegroups.com <javascript:;>.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy-alembic" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy-alembic+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to