Win32 ve Transact-SQL çakışmaları
Kullanan uygulamalar SqlOpenFilestream() açma okunurken veya yazılırken FILESTREAM blob verileri için Win32 dosya tanıtıcıları karşınıza çakışma hataları ile Transact-SQL ortak bir hareket yönetilen ifadeleriBu Transact-SQL ya da mars sorguları yürütme tamamlamak için uzun saat alıyor. Uygulamaları gerekir dikkatle tasarlanmış bu tür çakışmaları. önlemeye yardımcı olmak için
Zaman SQL Server Veritabanı Altyapısı veya uygulamalar FILESTREAM BLOB'lar açmaya Veritabanı Altyapısı bakar ilişkili işlem bağlamı.The Veritabanı Altyapısı allows or denies the request based on whether the open operation is working with DDL statements, DML statements, retrieving data, or managing transactions. The following table shows how the Veritabanı Altyapısı determines whether a Transact-SQL statement will be allowed or denied based on the type of files that are open in the transaction.
Transact-sql deyimleri |
Okuma için açılan |
Yazma için açılan |
---|---|---|
Veritabanı ile çalışacak ddl deyimleri meta veriler, create table, create INDEX, drop table ve alter table gibi. |
İzin verilen |
Engellenen ve bir saat aşımıyla başarısız. |
update, delete ve INSERT gibi veritabanında depolanan verilerle çalışmak dml deyimlerini. |
İzin verilen |
Reddedildi |
SEÇİN |
İzin verilen |
İzin verilen |
HAREKET TAMAMLAMA |
Reddedildi * |
Reddedildi *. |
HAREKET KAYDETME |
Reddedildi * |
Reddedildi * |
GERİ ALMA |
İzin verilen * |
İzin verilen * |
* İşlem iptal edilir ve hareket bağlamı için açık tanıtıcıları geçersiz.Uygulama, tüm açık işleyicileri kapatmanız gerekir.
Örnekler
Aşağıdaki örneklerde gösterildiği nasıl Transact-SQL ifadeleri ve Win32 FILESTREAM erişim neden olabilecek çakışmaları.
A.Bir FILESTREAM blob yazma erişimi için açma
Aşağıdaki örnek dosya yazma erişimi için açma etkisini gösterir.
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.Bir FILESTREAM blob okuma erişimi için açma
Aşağıdaki örnek dosya yalnızca okuma erişimi için açma etkisini gösterir.
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.Açılış ve kapanış birden fazla FILESTREAM blob dosyaları
Birden fazla dosya açıksa, en sınırlayıcı olan kural kullanılır.Aşağıdaki örnek, iki dosyaları açar.İlk dosya için okuma ve yazma için ikinci açılır.İkinci dosya açılıncaya kadar dml deyimlerini reddedilecektir.
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.Başarısız olan bir imleç kapatmak için
Kapalı olan bir deyim imleç nasıl engel olabilir, aşağıdaki örnekte gösterildiği OpenSqlFilestream() açılmasını DAMLA için yazma erişimi.
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.