2012-06-11 62 views
2

我對ssis轉換隔離級別有幾個問題。 考慮一個場景:我有一個執行SQL任務,它在表A中插入一個數據。這個任務指向一個數據流任務,讀取之前在AI上插入的數據已經開始分佈式事務,如果我設置事務隔離ssis爲readcommited,它是否首先執行sql任務並提交到數據流任務? 另外在這種情況下其他隔離級別呢?ssis中的事務隔離級別如何工作?

回答

1

從我的問題你可以理解你問什麼是適當的事務隔離,如果你想從表中讀取數據從同一個事務中的數據正在寫入表中?據我所知,這應該不重要。隔離類型僅用於解決其他事務想要修改未提交事務正在修改的行的情況。換句話說,只是讀表應該沒有問題,你應該看到第一個執行SQL任務的數據。寫入事務的數據在事務提交之前可用。

如需進一步閱讀,請參閱Oracle文檔,但相同的定義應適用於SQL和SSIS包。注意它們在兩個事務想要修改相同數據時解決:

SERIALIZABLE:如果可序列化事務嘗試執行修改任何已由未提交事務修改的表的SQL數據操作語句,則語句失敗。

READ COMMITTED:如果事務包含SQL數據操縱語句,該語句需要另一個事務持有的行鎖,則該語句會等待,直到釋放行鎖。

0

請勿下載此答案。我從MSDN論壇得到它,我將其留在這裏以供參考。

http://social.msdn.microsoft.com/Forums/en-US/3dcea5f6-32ef-40aa-90d5-0f2fef9e1d38/isolation-level-in-ssis

幾個觀測...

在SSIS組件IsolationLevel屬性僅在使用分佈式事務應用(包或其它容器具有的TransactionOption =必需的)。所以在這方面,隔離級別在SSIS中有點誤導。即使你設置了它,除非SSIS打開一個事務,否則它不會有幫助。我在這裏寫了關於此限制的信息:http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.dts.runtime.dtscontainer.isolationlevel.aspx

如果要自定義從SSIS調用的TSQL(存儲過程或僅在批處理的開始處)的隔離級別,則可以覆蓋默認的SQL Server隔離級別Read_committed但是,如果您只是指向數據流源或目標中的表名稱,則無法設置隔離級別。

如果您選擇手動設置在每個查詢的其他方式的隔離級別,有幾個技巧:1。 如果你運行在你的命令的SET選項「中設置事務隔離級別未提交讀」 http://msdn.microsoft.com/en-us/library/ms173763.aspx

請仔細閱讀未提交& Nolock,因爲它可以讀取髒數據(其他連接不完全承諾的數據變化)。)

  1. 使用鎖定提示如http://technet.microsoft.com/en-us/library/ms187373.aspx SELECT * FROM T1(NOLOCK)

  2. 設置在OLEDB或ODBC自動提交隔離級別,如果有覆蓋連接字符串中佔有一席之地或驅動程序的屬性http://msdn.microsoft.com/en-us/library/ms175909.aspx我還沒有測試過,但它可能是可能的。

要查看正在使用的隔離級別,您連接到在SQL Server 2005/2008,如果您的RDBMS,而連接/會話仍處於活動狀態,您可以查詢DBCC USEROPTIONS或dm_exec_sessions

選擇選擇transaction_isolation_level,*從sys.dm_exec_sessions (0 =未指定,1 = ReadUncomitted,2 = READCOMMITTED,3 =重複,4 =序列化,5 =快照)

我們還發現,快照隔離級別是不兼容的分佈式事務,因此不可能使用快照隔離級別通過SSIS屬性。解決方法是直接在數據源中使用TSQL語法快照隔離內的數據源& ExecuteSqlTask​​命令。

祝你好運,傑森 他的MSDN資料 - http://social.msdn.microsoft.com/profile/jason%20h%20(hdinsight)/?ws=usercard-mini

+0

你的最後一個環節是無效的。 –

+0

您能否告訴我您是如何發現「快照隔離級別與分佈式事務不兼容的,因此無法通過SSIS屬性使用快照隔離級別」。 ? –