私の質問は単純です:違い/類似点/カーディナリティは何ですか
sQL Serverでは?
私が理解している限り、接続はSQL Serverインスタンスとクライアント間の単一の通信チャネルであり、その中でバッチとしてグループ化されたステートメントのコレクションが実行されます。バッチは、暗黙的または明示的に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コマンドのコレクションです。