Udostępnij za pośrednictwem


Win32 i konfliktów Transact-SQL

Aplikacje używające SqlOpenFilestream() otworzyć dojścia do plików Win32 do odczytu lub zapisu danych typu BLOB FILESTREAM można napotkać błędy konflikt z Transact-SQL instrukcji, które są zarządzane w typowych transakcji.Obejmuje to Transact-SQL lub MARS kwerendy, które trwać bardzo długo czas na zakończenie realizacji. Aplikacji muszą być starannie zaprojektowane aby uniknąć tego typu konflikty.

Gdy Aparat baz danych programu SQL Server lub aplikacje, spróbuj otworzyć bloków BLOB FILESTREAM, Aparat baz danych sprawdza kontekst transakcji skojarzony. Aparat baz danych Zezwala lub odrzuca żądanie, w zależności od tego, czy operacja otwierania działa z instrukcja DDL DML instrukcja, pobieranie danych lub Zarządzanie transakcjami. Tabela poniżej zawiera jak Aparat baz danych Określa, czy Transact-SQL instrukcja będzie dozwolone lub odrzucone na podstawie typu plików, które są otwarte w transakcji.

Instrukcje języka Transact-SQL

Otwarty do odczytu

Otwarty do zapisu

Instrukcje DDL, które działają z metadane baz danych, takich jak CREATE TABLE, CREATE INDEX, DROP TABLE i ALTER TABLE.

Dozwolone

Są zablokowane i nie powiedzie się z czas-limit.

DMLinstrukcje, które pracy z danymi przechowywanymi w bazie danych, takie jak aktualizacja, usuwanie i wstawianie.

Dozwolone

Odmowa dostępu

WYBIERZ

Dozwolone

Dozwolone

ZATWIERDZENIA TRANSAKCJI

Odmowa dostępu *

Odmowa dostępu *.

ZAPISYWANIE TRANSAKCJI

Odmowa dostępu *

Odmowa dostępu *

WYCOFYWANIE

Dozwolone *

Dozwolone *

* Anulowane transakcji i otwarte dojścia kontekstu transakcji są unieważnione.Wniosek należy zamknąć wszystkie otwarte dojścia.

Przykłady

W następujących przykładach pokazano sposób Transact-SQL instrukcji i FILESTREAM Win32 dostępu mogą powodować konflikty.

A.Otwieranie BLOB FILESTREAM do zapisu

Poniższy przykład przedstawia wynik Otwieranie pliku tylko do zapisu.

dstHandle =  OpenSqlFilestream(dstFilePath, Write, 0,
    transactionToken, cbTransactionToken, 0);

//Write some date to the FILESTREAM BLOB.
WriteFile(dstHandle, updateData, …);

//DDL statements will be denied.
//DML statements will be denied.
//SELECT statements will be allowed. The FILESTREAM BLOB is
//returned without the modifications that are made by
//WriteFile(dstHandle, updateData, …).
CloseHandle(dstHandle);

//DDL statements will be allowed.
//DML statements will be allowed.
//SELECT statements will be allowed. The FILESTREAM BLOB
//is returned with the updateData applied.

B.Otwieranie BLOB FILESTREAM do odczytu

Poniższy przykład przedstawia wynik Otwieranie pliku tylko do odczytu.

dstHandle =  OpenSqlFilestream(dstFilePath, Read, 0,
    transactionToken, cbTransactionToken, 0);
//DDL statements will be denied.
//DML statements will be allowed. Any changes that are
//made to the FILESTREAM BLOB will not be returned until
//the dstHandle is closed.
//SELECT statements will be allowed.
CloseHandle(dstHandle);

//DDL statements will be allowed.
//DML statements will be allowed.
//SELECT statements will be allowed.

C.Otwieranie i zamykanie wiele plików FILESTREAM BLOB

Jeśli pliki są otwarte, używana jest reguła najbardziej restrykcyjne.Poniższy przykład otwiera dwóch plików.Pierwszy plik zostanie otwarty do odczytu, a drugi do zapisu.DMLinstrukcje zostaną odrzucone, aż do otwarcia drugiego pliku.

dstHandle =  OpenSqlFilestream(dstFilePath, Read, 0,
    transactionToken, cbTransactionToken, 0);
//DDL statements will be denied.
//DML statements will be allowed.
//SELECT statements will be allowed.

dstHandle1 =  OpenSqlFilestream(dstFilePath1, Write, 0,
    transactionToken, cbTransactionToken, 0);

//DDL statements will be denied.
//DML statements will be denied.
//SELECT statements will be allowed.

//Close the read handle. The write handle is still open.
CloseHandle(dstHandle);
//DML statements are still denied because the write handle is open.

//DDL statements will be denied.
//DML statements will be denied.
//SELECT statements will be allowed.

CloseHandle(dstHandle1);
//DDL statements will be allowed.
//DML statements will be allowed.
//SELECT statements will be allowed.

D.Niepowodzenie zamknąć kursor

W poniższym przykładzie pokazano, jak można zapobiec kursor instrukcja, który nie jest zamknięty OpenSqlFilestream() Otwieranie BLOB dla zapisu.

TCHAR *sqlDBQuery =
TEXT("SELECT GET_FILESTREAM_TRANSACTION_CONTEXT(),")
TEXT("Chart.PathName() FROM Archive.dbo.Records");

//Execute a long-running Transact-SQL statement. Do not allow
//the statement to complete before trying to
//open the file.

SQLExecDirect(hstmt, sqlDBQuery, SQL_NTS);

//Before you call OpenSqlFilestream() any open files
//that the Cursor the Transact-SQL statement is using
// must be closed. In this example,
//SQLCloseCursor(hstmt) is not called so that
//the transaction will indicate that there is a file
//open for reading. This will cause the call to
//OpenSqlFilestream() to fail because the file is
//still open.

HANDLE srcHandle =  OpenSqlFilestream(srcFilePath,
     Write, 0,  transactionToken,  cbTransactionToken,  0);

//srcHandle will == INVALID_HANDLE_VALUE because the
//cursor is still open.