3

ssis トランザクションの分離レベルについていくつか質問があります。シナリオを考えてみましょう: テーブル A にデータを挿入する SQL 実行タスクがあります。このタスクは、AI に以前に挿入されたデータを読み取るデータフロー タスクを指しており、分散トランザクションを開始し、ssis でトランザクション分離を設定した場合readcommited として、最初にテーブル A をコミットして SQL タスクを実行し、データフロー タスクに移動しますか? また、このシナリオの他の分離レベルはどうですか?

4

2 に答える 2

3

あなたの質問から私が理解できることから、データがテーブルに書き込まれているのと同じトランザクションでテーブルからデータを読み取りたい場合、適切なトランザクション分離は何であるかを尋ねていますか?私の知る限り、それは問題ではないはずです。分離タイプは、コミットされていないトランザクションが変更しているのと同じ行を別のトランザクションが変更したい状況にのみ対処します。つまり、テーブルを読み取るだけで問題はなく、最初のSQL実行タスクのデータが表示されるはずです。トランザクションに書き込まれたデータは、トランザクションがコミットされる前に利用できます。

詳細については、これはOracleのドキュメントからのものですが、SQLおよびSSISパッケージにも同じ定義を適用する必要があります。2つのトランザクションが同じデータを変更する場合に対処することに注意してください。

SERIALIZABLE:シリアライズ可能なトランザクションが、コミットされていないトランザクションによってすでに変更されているテーブルを変更するSQLデータ操作ステートメントを実行しようとすると、ステートメントは失敗します。

READ COMMITTED:トランザクションに別のトランザクションによって保持された行ロックを必要とするSQLデータ操作ステートメントが含まれている場合、ステートメントは行ロックが解放されるまで待機します。

于 2012-06-13T14:09:51.963 に答える
1

この回答に反対票を投じないでください。MSDN フォーラムから入手したので、参照用にここに保管します。

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

いくつかの観察...

SSIS コンポーネントの IsolationLevel プロパティは、分散トランザクションが使用されている場合にのみ適用されます (パッケージまたは他のコンテナーに TransactionOption=Required がある)。その点で、分離レベルは SSIS では少し誤解を招きます。設定しても、SSIS によってトランザクションが開かれない限り、役に立ちません。ここでその制限について書きました: http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.dts.runtime.dtscontainer.isolationlevel.aspx

SSIS から呼び出される TSQL (ストアド プロシージャまたはバッチの開始時) で分離レベルをカスタマイズしている場合、既定の SQL Server 分離レベル Read_committed をオーバーライドできます。分離レベルを設定することはできません。

各クエリで別の方法で分離レベルを手動で設定することを選択した場合、いくつかのテクニックがあります。 .microsoft.com/en-us/library/ms173763.aspx

Read Uncommitted & 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それをテストしていませんが、可能かもしれません。

使用されている分離レベルを確認するには、接続先の RDBMS が SQL Server 2005/2008 の場合、接続/セッションがまだアクティブな間に DBCC USEROPTIONS をクエリするか、dm_exec_sessions から選択します

select transaction_isolation_level,* from sys.dm_exec_sessions (0 = Unspecified, 1 = ReadUncommitted, 2 = ReadCommitted, 3 = Repeatable, 4 = Serializable, 5 = スナップショット)

また、スナップショット分離レベルは分散トランザクションと互換性がないため、SSIS プロパティを通じてスナップショット分離レベルを使用できないことも判明しました。その回避策は、データ ソース内でスナップショット分離の TSQL 構文を使用し、ExecuteSqlTask​​ コマンドを直接使用することです。

幸運を祈ります。Jason の MSDN プロファイル - http://social.msdn.microsoft.com/profile/jason%20h%20(hdinsight)/?ws=usercard-mini

于 2013-11-09T22:21:37.210 に答える