FILESTREAM uygulamalarında veritabanı işlemleri ile çatışmaları önlemek
Kullanan uygulamalar **SqlOpenFilestream()**okuma veya yazma FILESTREAM blob verileri için Win32 dosya tanıtıcıları açmak için çakışma hatalarıyla karşılaşabilirsiniz Transact-SQLortak bir hareket içinde yönetilen deyimleri. Bu Transact-SQLya da mars sorguları yürütme tamamlamak için uzun bir zaman alacak. Uygulamaları gerekir özenle tasarlanmış bu tür çakışmaları önlemek için.
Ne zaman SQL Server Veritabanı Altyapısıveya FILESTREAM BLOB, açmaya çalıştığınızda uygulama Veritabanı Altyapısıilişkili işlem içeriği denetler. Veritabanı Altyapısıİzin verir veya vermez mi açma işlemi dml deyimleri ddl deyimleri ile çalışma, veri alma veya hareketlerini yönetme temel isteği. Aşağıdaki tablo gösterir nasıl Veritabanı Altyapısıbelirler olup bir Transact-SQLifade reddedilecek göre hareket açık olan dosyalar tür.
Transact-SQL deyimleri |
Okuma için açılan |
Yazma için açılan |
---|---|---|
create table, create INDEX, drop table ve alter table gibi veritabanı meta çalışmak ddl deyimleri. |
İzin verilen |
Engellenen ve bir zaman aşımı ile 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 |
TAMAMLAMA HAREKET |
Reddedilen * |
Reddedilen *. |
HAREKET KAYDETME |
Reddedilen * |
Reddedilen * |
GERİ ALMA |
İzin * |
İzin * |
* İşlem iptal edilir ve hareket bağlamı için açık tanıtıcıları geçersiz. Uygulama tüm açık tanıtıcıları kapatmanız gerekir.
Örnekler
Aşağıdaki örneklerde nasıl Transact-SQLdeyimleri ve FILESTREAM Win32 erişim çakışmalara neden olabilir.
A.FILESTREAM blob yazma erişimi için açma
Aşağıdaki örnek dosya yalnızca 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.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ış çok FILESTREAM blob dosyaları
Birden fazla dosya açıksa, en kısıtlayıcı kural kullanılır. Aşağıdaki örnek, iki dosya açılır. İlk dosyayı okuma ve yazmak için ikinci açılır. İkinci dosya açılana 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.Bir imleç kapatmak için başarısız
Aşağıdaki örnek bir deyimi imleç kapalı değil nasıl önleyebilirsiniz gösterir OpenSqlFilestream()blob yazma erişimi açmasını.
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.
Ayrıca bkz.
Başvuru
Erişim FILESTREAM veri ile OpenSqlFilestream