<div dir="ltr">Hi:<div><br></div><div>'mnesia_tm' use 3 phases to implement the 'asym_trans' protocol </div><div>The first phase is the phase of 'asc_commit', the second is 'pre_commit', and the third is 'do_commit'.</div><div><br></div><div>In the 'do_commit' phase, the code snippet:</div><div><br></div><div>%% Now everybody knows that the others<br>%% has voted yes. We also know that<br>%% everybody are uncertain.<br>prepare_sync_schema_commit(Store, SchemaAckPids),<br><b><i>tell_participants(GoodPids, {Tid, committed}),</i></b><br>D2 = D#decision{outcome = committed},<br>mnesia_recover:log_decision(D2),<br>?eval_debug_fun({?MODULE, rec_acc_pre_commit_log_commit},<br>[{tid, Tid}]),<br><br>%% Now we have safely logged committed<br>%% and we can recover without asking others<br>do_commit(Tid, Commit, DumperMode),<br>?eval_debug_fun({?MODULE, rec_acc_pre_commit_done_commit},<br>[{tid, Tid}]),<br>sync_schema_commit(Tid, Store, SchemaAckPids),<br>mnesia_locker:release_tid(Tid),<br>?MODULE ! {delete_transaction, Tid};<br></div><div><br></div><div>I'm confused that how this protocol guarantee the data consistent?</div><div>The code 'tell_participants(GoodPids, {Tid, committed})' is asynchronous. If one or more participates down at this moment, the data could be inconsistent, right ?</div><div><br></div><div>If the data become inconsistent, why use asym protocal ???</div></div>