On Thu, May 7, 2009 at 10:08 PM, Rob Wultsch <[email protected]> wrote:
> On Thu, May 7, 2009 at 8:10 PM, Baron Schwartz <[email protected]> wrote:
>> Clint's proposal would work very well for certain workloads.  At a
>> coarser level, it would be beneficial for some other workloads to do
>> table-level dependency checking.  This is a very old and well
>> understood problem as far as I know (though I am not the expert on it
>> myself) -- I remember studying this in chip architecture classes in
>> college.
>>
>> That is: if two transactions don't touch the same tables, they are
>> fine to run concurrently, in any order.  Or even if they do -- as long
>> as they're only reading from the shared tables, they're fine to run
>> concurrently.  It's all a question of read-after-write and write-after
>> write and all that -- there are only four combinations.
>>
>> There are a lot of  edge cases that I think would make this
>> complicated.  If the slave stops while it was applying several
>> transactions, where should it start again?  Maybe transaction 5 was
>> finished, but 4 and 3 were halfway through and got rolled back.  I
>> expect a lot of similar nasties to rear their heads.
>>
>> (This particular one could be solved by executing parallel but
>> commiting in the original order, of course.)
>>
>> Baron
>>
>
> Disclaimer: I am sure I do not understand the scope of the problem
> well enough to intelligently comment. I will be interested to hear
> what is wrong with what I outline below.
>
> Perhaps a log of what transactions have committed would be useful.
> Assuming we are considering transactional storage engines then the
> uncommitted transactions should rollback if replication is stopped or
> the server dies unexpectedly. When replication restarts replication
> would start executing the oldest transaction, and move forward in the
> log ignoring any transaction that have already committed. I think that
> non-transactional engines might also be able to use such a technique
> if one treats every query as a standalone transaction. Partially
> completed queries on non-transaction engines are problematic though.
>
> In terms of the issue of deadlocks would a possible solution be record
> the start and end time (actually time is rather horrible, perhaps a
> some sequence of some sort) of each transaction on the master and have
> earlier transaction block newer transaction if there is the
> possibility that the same resource might be being altered. Perhaps if
> there is a deadlock have the newer transaction rollback and wait to
> execute until the older transaction has completed? Assuming older
> transactions or pseudo transaction block newer ones I think this would
> work with non-transactional engines.
>
>
> --
> Rob Wultsch
> [email protected]
>

Thinking about it more I wonder if forcing the transaction to commit
on the slave in the order that they were committed on the master would
be part of the solution.

-- 
Rob Wultsch
[email protected]

_______________________________________________
Mailing list: https://launchpad.net/~drizzle-discuss
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~drizzle-discuss
More help   : https://help.launchpad.net/ListHelp

Reply via email to