2013-10-12 101 views
0

看起來我對SQL數據庫的工作原理缺乏一些基本的瞭解,特別是MySQL。 (編輯:現在我正在使用InnoDB引擎。)我有一個用純Groovy(沒有Grails)編寫的程序中的線程,CREATE TABLE使用groovy.sql.Sql,這應該是一個圍繞JDBC的包裝。我的問題是,在這個調用返回之後,我可以立即從另一個線程訪問此表,還是取決於運氣?我必須打電話給sql.close()或者我必須先從創建線程訪問表,然後從邏輯上它必須被創建?是否立即執行SQL語句?

我知道,例如,如果我有一個交易,那麼該陳述可能不會立即產生影響......或者我認爲。即使我不明確創建事務,但誰知道Groovy或JDBC是否會爲我創建一個事務。如果我使用Hibernate或其他框架,它也可以執行任何它認爲最優化的操作。我的印象是,即使sqlalchemy python可能會做這種優化,除非我不告訴它。同樣,如果MySQL本身以某種方式緩存我的聲明以供將來執行,爲了性能優化,而不是馬上執行它呢?

是否有任何正式的規則或原則,如ACID,讓我有一定的確定性?我如何知道SQL語句何時完成,以便使用其結果?當然,這同樣適用於其他語言和數據庫類型。

+0

您是否使用InnoDB引擎? – mvp

+0

@mvp:是的。答案是否重要? – osa

+1

它的確如此,因爲InnoDB完全是事務性的(不像MyISAM) – mvp

回答

2

是的,您可以在創建後立即使用表格,但有一些條件。

如果您在同一個交易中執行此操作,則沒有限制。

如果你正在做它在單獨的線程,則兩個條件必須滿足:所用CREATE TABLE

  • 交易必須承諾。
  • 正在嘗試使用新表的線程必須在之後啓動另一個事務第一個承諾。

您可以通過始終使用CREATE TABLE IF NOT EXISTS來減輕這一點。

+0

謝謝! 1.保證不同的線程使用不同的連接,因此不在同一個事務中? 2.如果我使用groovy.sql作爲JDBC的封裝器(它是用於SQL的封裝器),我如何知道事務提交是否/何時提交?我可能需要了解這兩種工作方式,不是嗎? 3.當我明確提交一個事務並且在提交返回後,是否意味着我現在已經100%安全了? – osa

+0

1.它不是,取決於你的應用程序。通常你想要[每個線程的連接](http://stackoverflow.com/a/1456878/1734130)。 3.是的,如果交易提交,只有*然後*你開始另一個,你是安全的。 – mvp

+0

太好了......我會詳細閱讀這個主題。它看起來像默認情況下保持自動提交模式:http://stackoverflow.com/questions/4940648/how-to-start-a-transaction-in-jdbc。順便說一句,你是如何在評論中插入鏈接的? – osa