2011-05-23 104 views
0

我目前正在創建一個消息系統,我想知道我是否應該使用交易(從我瞭解他們的目的)。MySQL交易

我目前有三個表:

對話:主題等
消息:消息(FK約束,以對話表)
參與者:人的用戶ID在交談

可以說,用戶必須是對話的參與者才能閱讀它。在一個頁面中,我會執行兩個查詢,一個用於對話數據,另一個用於消息。這可能是我的偏執,但我怎麼能確保用戶參與(事物的總體狀態)在這兩個查詢之間不會改變?交易會是關鍵嗎?我會遇到任何性能問題嗎?

(參與通過兩個查詢連接進行檢查)

在此先感謝。

回答

0

交易應該肯定有助於您的情況。您可能需要從數據庫約束中獲得一些額外的幫助。

+0

謝謝隊友。我目前有一個約束,以便消息和參與者不能沒有對話存在,但我猜我需要交易來保證用戶的參與在整個查詢過程中保持不變。 – RS7 2011-05-23 17:45:22

0

如果您擔心某人可能會在兩次查詢之間離開對話(通過單獨的進程或請求),那麼交易不是您想要的。什麼你想要做的就是添加一個加入到「對話」表過濾掉的人是在談話中不再,東西有點像這樣:

select stuff 
from messages m 
join conversations c on (m.conversation = c.id and c.person = $current_user) 
where ... 

$current_user是有問題的用戶。然後,如果$current_user不再處於對話中,則沒有行會出現在連接中,也不會選擇任何內容。

+0

我對會話查詢(返回1行)和消息查詢(返回n行)都有一個參與表連接,以便它們只與參與一起返回 - bu如何防止查詢之間的參與不發生變化? – RS7 2011-05-23 17:52:01

+0

@RS7:然後,AFAIK是一個具有[isolation level](http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html)「重複讀取」的事務。 – 2011-05-23 18:16:53

0

爲什麼你不喜歡穆的建議?只需添加一點點扭曲...

select m.* 
from messages m 
join conversations c on (m.conversation = c.id) 
join participation p on (p.conversation = c.id) 
where p.person = $current_user 
and... 

我錯過了什麼嗎? 事務通常用於確保寫入操作中的記錄之間的一致性,而不是讀取。