|
|
|
Транзакции в jdbc
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Многопользовательское приложение, две зависимые таблицы (master-detail). HB_Auto - master, HB_AutoTanks - detail. В таблицах есть специальное поле f_Locked в которое заносится идентификатор залогинившегося пользователя, который эту запись заблокировал. Попытка удалить запись в родительской таблице: Перед удалением записи в родительской таблице, пытаюсь удалить все записи в дочерней таблице. Перед удалением записи из дочерней таблицы, проверяю ее на занятость. Если хотя бы одна запись занята, то надо откатить все изменения. Т.е. вернуть все удаленные записи в дочерней таблице: Делаю так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. Допустим, что 5 строка в дочерней таблице заблокирована. При выполнении этого кода будут удалены первые 4 строки, перед тем, как будет обнаружена, что 5 занята, и должен произойти откат удаления первых 4 записей! А он не происходит. Т.е. в отладчике я проверяю - действительно выполняется метод .rollback(), но эффекта нет. Удаленные записи уже безвозвратно потеряны. Наверное, я не понял документацию. Поясните в чем дело? С уважением Vector ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2006, 10:36 |
|
||
|
Транзакции в jdbc
|
|||
|---|---|---|---|
|
#18+
Где гарантия того что database.getConnection() возвращает всегда один и тотже Connection? Делаеш все немного глупо. 1. Если хочеш удалить то можно использовать создание FK с ON DELETE CASCADE. 2. Выгоднее вначале заблокировать все записи командой Код: plaintext Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2006, 11:01 |
|
||
|
Транзакции в jdbc
|
|||
|---|---|---|---|
|
#18+
авторГде гарантия того что database.getConnection() возвращает всегда один и тотже Connection? В классе database есть указатель на объект Connection, который создается в начале работы программе и не изменяется, т.е. приложение работает только с одим соединением. Во все конструкторы фреймов я передаю этот указатель, поэтому везде работаю только с один подключением к базе данных. автор1. Если хочеш удалить то можно использовать создание FK с ON DELETE CASCADE. Я так понимаю FK - это Foreign Key? Все связи между таблицами у меня определены логикой приложения, а не самой базой данных. Сделано это для облегчения переноса базы данных с одной СУДБ на другую. автор2. Выгоднее вначале заблокировать все записи командой UPDATE HB_Auto WHERE f_ID=f_ID where f_ID=:id И уже потом на них выполнять DELETE Этого я сделать не могу, так в этот момент записи могут быть заблокированы другим пользователем. Данной командой я просто перепишу блокировки, что делать нельзя. Самое оптимальное здесь - это транзакция. Одна транзакция. Которая не работает. И меня собстенно интересует почему она не работает. Именно это и является вопросом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2006, 11:10 |
|
||
|
Транзакции в jdbc
|
|||
|---|---|---|---|
|
#18+
0. А сервер БД чисто случайно не MySQL 3.x/4.x ??? 1. если приложение [многопользовательское], то все ли в порядке с синхронизацией доступа к соединению из разных потоков? 2. Неплохо было бы ознакомится с документаций к используемому JDBC драйверу. смысл заключается в том, что JDBC - это набор интерфейсов. Конкретный драйвер может реализовывать НЕ ВСЕ интерфейсы, либо реализовывать их НЕПОЛНОСТЬЮ. в вашем случае,например, это может означать что setAutoCommit(false) может ничего не делать, а собственно опцию автокоммита надо устанавливать с помощью свойств соединения(см. DriverManager.getConnection(2) ) либо через SQL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2006, 13:03 |
|
||
|
Транзакции в jdbc
|
|||
|---|---|---|---|
|
#18+
В данный момент работаю с MySQL 5 через драйвер, который дают разработчики: mysql-connector-java-3.1.12 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2006, 13:03 |
|
||
|
Транзакции в jdbc
|
|||
|---|---|---|---|
|
#18+
Vector2. Выгоднее вначале заблокировать все записи командой UPDATE HB_Auto WHERE f_ID=f_ID where f_ID=:id И уже потом на них выполнять DELETE Этого я сделать не могу, так в этот момент записи могут быть заблокированы другим пользователем. Данной командой я просто перепишу блокировки, что делать нельзя. Ты о чем говориш? если у тебя на n-шаге возникнет блокировка выводиш сообщение и по roolback ты все освобождаеш. VectorСамое оптимальное здесь - это транзакция. Одна транзакция. Которая не работает. И меня собстенно интересует почему она не работает. Именно это и является вопросом. Скорее всего ответ вот в этом: VectorВ данный момент работаю с MySQL 5 через драйвер, который дают разработчики: mysql-connector-java-3.1.12 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2006, 14:05 |
|
||
|
Транзакции в jdbc
|
|||
|---|---|---|---|
|
#18+
Народ! Кажется разобрался! Дело в том, что у меня не использовался InnoDB Engine Storage, а использовался MyISAM Engine Storage, соответственно транзакции не работали на стороне сервера. Сейчас все заработало. Спасибо всем участникам! Всем удачи! С уважением Vector ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2006, 14:11 |
|
||
|
Транзакции в jdbc
|
|||
|---|---|---|---|
|
#18+
Vector Дело в том, что у меня не использовался InnoDB Engine Storage, а использовался MyISAM Engine Storage, соответственно транзакции не работали на стороне сервера. пожалуйста, поясните, если не трудно, что такое InnoDB Engine Storage и MyISAM Engine Storage , и каким образом это может влиять на транзакции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2006, 16:47 |
|
||
|
Транзакции в jdbc
|
|||
|---|---|---|---|
|
#18+
unicornmirage Vector Дело в том, что у меня не использовался InnoDB Engine Storage, а использовался MyISAM Engine Storage, соответственно транзакции не работали на стороне сервера. пожалуйста, поясните, если не трудно, что такое InnoDB Engine Storage и MyISAM Engine Storage , и каким образом это может влиять на транзакции? Это разные типы хранилища данных для MySQL. MyISAM - быстрый на селектах, но не поддерживает кучу возможностей, в том числе и транзакции. InnoDB более медленный на селектах, но более "фичастый". Подробнее здесь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2006, 17:19 |
|
||
|
|

start [/forum/search_topic.php?author=lisnake&author_mode=last_topics&do_search=1]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
70ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
50ms |
get tp. blocked users: |
2ms |
| others: | 486ms |
| total: | 672ms |

| 0 / 0 |
