私の質問は単純です:違い/類似点/カーディナリティは何ですか
- 取引
- バッチ
- 接続と
- ステートメント
SQL Serverでは?
私が理解している限り、接続はSQL Serverインスタンスとクライアント間の単一の通信チャネルであり、その中で、バッチとしてグループ化されたステートメントのコレクションが実行されます。バッチは、暗黙的または明示的に1つまたは複数のトランザクションにマップされます。これは正しいです?
私の質問は単純です:違い/類似点/カーディナリティは何ですか
SQL Serverでは?
私が理解している限り、接続はSQL Serverインスタンスとクライアント間の単一の通信チャネルであり、その中で、バッチとしてグループ化されたステートメントのコレクションが実行されます。バッチは、暗黙的または明示的に1つまたは複数のトランザクションにマップされます。これは正しいです?
回答:
かなり。
バッチとは、実行する必要のあるコマンドのバッチです。トランザクションは、成功または完全に失敗することが保証されているコマンドのセットです(つまり、コマンドの半分が完了せず、残りの1つが失敗すると、すべて失敗します)。
SQL Serverは接続プールを使用しているので、クライアントごとに1つの接続に依存することはありません。
トランザクションとバッチは、2つの独立した概念です。どちらも1対多の構成で使用できます。
トランザクションブロックは単一の「作業単位」であり、コミットされたSQLは完全に機能するか、まったく機能しないかのどちらかであるという概念です。たとえば、相互にリンクされた2つのテーブルを更新するとします。データ変更をコミットするには、両方が成功する必要があります。[ https://msdn.microsoft.com/en-us/library/ms174377.aspx]
バッチはマイクロソフトのコンセプトです。Microsoftが作成したsqlcmdやosqlなどのツールを使用すると、バッチは単一の実行プランを保証するだけです。たとえば、変数を作成してバッチの外で使用すると、ツールによってエラーがスローされます。[ https://msdn.microsoft.com/en-us/library/ms188037.aspx]
したがって、1つのトランザクションブロック内で複数のテーブルを更新する複数のバッチを持つことができます。個別のバッチ実行計画に違反していない限り。
また、バッチ内で複数のトランザクションブロックを使用して、テーブルなどのデータベースエンティティ間のデータの整合性を確保できます。
接続は、サーバー上でクエリを実行することを承認する通信ハンドシェイクです。
ステートメントは、クエリを形成する個々の行です。GO(T-Sqlバッチ区切り記号)とBEGIN TRANSACTION(新しいトランザクションブロックを開始するためのANSI SQL)はどちらもステートメントです。
バッチとトランザクションは同じレベルに存在します。バッチは、他の点では無関係なSQLコマンドのコレクションです。トランザクションは、(そのデータベースの他のすべてのユーザーに関する限り)1つのステートメントとして動作するSQLコマンドのコレクションです。