Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Транзакция и DBConcurrencyException не могут подружиться
|
|||
|---|---|---|---|
|
#18+
Доброго время суток! Сохраняю БД с транзакцией (код ниже), и в тоже время мне надо обрабатывать ошибки параллельного обновления. Хотел написать обработку событий RowUpdated, для каждого DataAdapter, но Expception все равно будет вылетать. Посоветуйте, как мне сделать, чтобы при ошибке параллельного обновления, пользователю предлагалось или перезаписать строку несмотря ни на что, или считать обновленную строку другим пользователей. А если какая то ошибка, кроме DBConcurrencyException, то откат транзакции. Сохраняются у меня все изменения за раз, после нажатия кнопки "Сохранить", а не после каждого локального изменения строки в какой либо таблице OleDbTransaction tran = oleDbConnection1.BeginTransaction(il); //Мы не используем свою логику обновления, так что в транзакцию //входят SelectCommand, а не Update, Delete, Insert daGamePlayer.InsertCommand.Transaction = tran; daGameArbiter.InsertCommand.Transaction = tran; daArbiters.InsertCommand.Transaction = tran; daPlayers.InsertCommand.Transaction = tran; daGames.InsertCommand.Transaction = tran; daPersonal.InsertCommand.Transaction = tran; daTeams.InsertCommand.Transaction = tran; daGamePlayer.UpdateCommand.Transaction = tran; daGameArbiter.UpdateCommand.Transaction = tran; daArbiters.UpdateCommand.Transaction = tran; daPlayers.UpdateCommand.Transaction = tran; daGames.UpdateCommand.Transaction = tran; daPersonal.UpdateCommand.Transaction = tran; daTeams.UpdateCommand.Transaction = tran; daGamePlayer.DeleteCommand.Transaction = tran; daGameArbiter.DeleteCommand.Transaction = tran; daArbiters.DeleteCommand.Transaction = tran; daPlayers.DeleteCommand.Transaction = tran; daGames.DeleteCommand.Transaction = tran; daPersonal.DeleteCommand.Transaction = tran; daTeams.DeleteCommand.Transaction = tran; try { //Чтобы избежать нарушения ссылочной целостности при обновлении //источника данных, обновлять строки нужно в следующем порядке daGamePlayer.Update(dsPHL1.Tables["GamePlayer"].Select(null,null, DataViewRowState.Deleted)); daGameArbiter.Update(dsPHL1.Tables["GameArbiter"].Select(null,null, DataViewRowState.Deleted)); daArbiters.Update(dsPHL1.Tables["Arbiters"].Select(null,null, DataViewRowState.Deleted)); daPlayers.Update(dsPHL1.Tables["Players"].Select(null,null, DataViewRowState.Deleted)); daGames.Update(dsPHL1.Tables["Games"].Select(null,null, DataViewRowState.Deleted)); daPersonal.Update(dsPHL1.Tables["Personal"].Select(null,null, DataViewRowState.Deleted)); daTeams.Update(dsPHL1.Tables["Teams"].Select(null,null, DataViewRowState.Deleted)); daTeams.Update(dsPHL1.Tables["Teams"].Select(null,null, DataViewRowState.ModifiedCurrent)); daTeams.Update(dsPHL1.Tables["Teams"].Select(null,null, DataViewRowState.Added)); daPersonal.Update(dsPHL1.Tables["Personal"].Select(null,null, DataViewRowState.ModifiedCurrent)); daPersonal.Update(dsPHL1.Tables["Personal"].Select(null,null, DataViewRowState.Added)); daGames.Update(dsPHL1.Tables["Games"].Select(null,null, DataViewRowState.ModifiedCurrent)); daGames.Update(dsPHL1.Tables["Games"].Select(null,null, DataViewRowState.Added)); daPlayers.Update(dsPHL1.Tables["Players"].Select(null,null, DataViewRowState.ModifiedCurrent)); daPlayers.Update(dsPHL1.Tables["Players"].Select(null,null, DataViewRowState.Added)); daArbiters.Update(dsPHL1.Tables["Arbiters"].Select(null,null, DataViewRowState.ModifiedCurrent)); daArbiters.Update(dsPHL1.Tables["Arbiters"].Select(null,null, DataViewRowState.Added)); daGameArbiter.Update(dsPHL1.Tables["GameArbiter"].Select(null,null, DataViewRowState.ModifiedCurrent)); daGameArbiter.Update(dsPHL1.Tables["GameArbiter"].Select(null,null, DataViewRowState.Added)); daGamePlayer.Update(dsPHL1.Tables["GamePlayer"].Select(null,null, DataViewRowState.ModifiedCurrent)); daGamePlayer.Update(dsPHL1.Tables["GamePlayer"].Select(null,null, DataViewRowState.Added)); tran.Commit(); } catch (Exception ex) { tran.Rollback(); MessageBox.Show(ex.Message + Environment.NewLine + "Ошибка сохранения данных на сервере." + Environment.NewLine + "Произведен откат транзакции."); } finally { oleDbConnection1.Close(); } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2005, 20:28 |
|
||
|
|

start [/forum/topic.php?desktop=1&fid=20&tid=1437008]: |
0ms |
get settings: |
12ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
52ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
25ms |
get tp. blocked users: |
1ms |
| others: | 252ms |
| total: | 376ms |

| 0 / 0 |
