On Wed, Apr 27, 2016 at 12:37 AM, Mike Bayer <mike...@zzzcomputing.com> 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>
>> 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.
> 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.
For more options, visit https://groups.google.com/d/optout.

Reply via email to