2009-12-11 26 views
1

它是關於以';'分隔的命令的任何信息嗎?在一個查詢中 - 他們是否是原子?我對流行數據庫的實際版本感興趣:MySQL,MSSQL,SQLite等?例如,如果100個客戶端將垃圾郵件以下查詢:SQL:是用';'分隔的多個命令原子或不是?

"insert into test (name) values ('1'); insert into test (name) values ('2')" 

威爾數據庫包含在序列項目「1」,「2」,「1」,「2」等或者可能的是通過分開的每個命令' ;」從100個客戶到每場比賽,導致「1」,「1」,「2」,「1」,「2」,「2」,「2」等?

回答

5

將它包裝在交易中。否則,不,通常不能保證你的陳述是原子的。

+0

謝謝。 SQL中的任何方式在查詢內執行> 1'插入'或'更新'而不創建事務?或者這是一個嚴格的規則,只有單個修改是原子性的,我需要每次創建事務? – grigoryvp

+0

爲什麼你非常在乎它不在交易中? –

+0

事務代碼是很多命令和一個失敗的情況下回滾。單個SQL請求是單個請求? :) – grigoryvp

1

在批次內,它們將按順序執行,但這不是你的問題。如果100個客戶端同時發出該SQL,則不能保證2個INSERTS將在沒有另一個INSERT執行的情況下依次執行。

1

我想這是一個理論問題,但爲什麼你會需要序列?

無論如何,您不能依賴數據庫中的序列,因此需要在表中添加某種時間戳列,並讓客戶端初始化一個時間戳變量,並在插入時添加到它們的記錄中。

+0

重要的序列如果數據庫包含一些鏈接到每個的OOP對象。插入和刪除這些對象將修改> 1條記錄,並且修改本身必須是原子性的,否則數據一致性將被打破。我是數據庫編程的新手,現在我正在研究的是事務處理的唯一方法,或者不是原子更改。 – grigoryvp

+1

那麼這正是交易的目的,對吧?在可能的情況下允許併發修改是數據庫的一大優點。記錄仍然可以按隨機順序插入/更新,但更改僅在COMMIT之後的其他會話中可見。 –

相關問題