SQLServer2000で、テーブル全体にロックをかけて、『Insert文→select文』を実現するためのSQL文の書式を教えてください。

上の『』内の2つのSQL処理を行っている間、他のプロセスからは一切該当のテーブルにさわれない(select文も許可しない)ようにしたいのです(※1)
( with(XLOCK)句は、該当行をロックするための記述ですよね?そうだと思っています・・ )

また、SQLServer2000に関して、ロックの種類やロックの範囲、ロックをかける際の注意点などについてまとめられた書籍またはWEBサイトがあれば教えてください。
こちらにもご回答いただければ、ポイントを多めに配分します。

よろしくお願いします。


※1
下記の例のような一連の処理。この間、他のプロセスにtableAに対するSQL文を実行させたくない。
 insert into tableA 〜〜〜〜〜〜 where ID=100
 select * from tableA where ID=100

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2005/10/22 11:18:17
  • 終了:--

回答(2件)

id:saoyama No.1

saoyama回答回数36ベストアンサー獲得回数02005/10/22 18:05:40

ポイント15pt

http://www.microsoft.com/japan/technet/prodtechnol/sql/2000/book...

Microsoft SQL Server 2000 リソースキット : 7.6 Oracle データベースから SQL Server 2000 への移行

このページはどうでしょうか?

SQLでロック関連は使ったことがないので、的確なコメントができなくて心苦しいのですが...

id:xml-document1

回答ありがとうございます。

なんだかそれらしい内容が書かれてありそうですね。

明日ゆっくり時間をとって、みてみたいと思います。

2005/10/23 00:01:19
id:rowlock No.2

rowlock回答回数16ベストアンサー獲得回数12005/10/22 18:32:26

ポイント35pt

http://www.microsoft.com/japan/msdn/library/default.asp?url=/jap...

MSDN ライブラリ サイト移行に関する重要なお知らせ

一般的に、SQLで複数の処理をまとめて保護するにはトランザクションを使います。


トランザクション分離レベルをserializableに設定すれば、トランザクションの有効区間内では他のユーザーから更新・挿入ができません。


下のサンプルで検証しました。クエリアナライザで2枚ウィンドウを開いて実行してみてください。

Aはinsert後に10秒待機するようにしてあります。Aを実行中に別ウィンドウ側で、Bのinsert/select/update/deleteのいずれを実行しても、処理はAが終了した後に行われます。


本来insertも止まるはずなのですが、試した限りではできてしまいました。

A側のinsert文にtablock(テーブル全体にロック)を指定したところ、insertもブロックできました。


なんかエエカゲンな気もしますがご参考になれば。


----


CREATE TABLE [test] (

[row_id] [int] IDENTITY (1, 1) NOT NULL ,

[person] [varchar] (50) NOT NULL

)


----

(A)

set transaction isolation level serializable

begin tran

insert into test with (tablock) (person) values (’aaa’)

waitfor delay ’00:00:10’

select * from test

commit tran


----

(B)

insert into test (person) values (’bbb’)

select * from test

update test set person=’ccc’ where row_id = 1

delete from test where row_id = 1

http://www.atmarkit.co.jp/fnetwork/rensai/sql27/sql1.html

@IT:トランザクションの一貫性を保証するロック

@ITの解説です

http://www.microsoft.com/japan/msdn/library/default.asp?url=/jap...

MSDN ライブラリ サイト移行に関する重要なお知らせ

ロックヒントの説明(MSDN)です

http://www.atmarkit.co.jp/fdotnet/entwebapp/entwebapp09/entwebap...

@IT:.NETエンタープライズWebアプリケーション開発技術大全 SQL Serverのロック管理

ロック機構そのものに関する説明です

http://www.atmarkit.co.jp/fnetwork/rensai/sql28/sql1.html

@IT:SQL Serverで「デッドロック」を回避する

serializableはテーブルを独占するため、同時実行性能が著しく落ちます。綿密な設計を行い、デッドロックには注意してください。

id:xml-document1

回答ありがとうございます。

明日時間をとって、これらのサイトを読んで生きたいと思います。

いちおう、ロックやトランザクションの概念は理解しているつもりなのですが、SQLServerでどうすればロックやトランザクション機能を実現できるのか、その実装方法がわかっていない状況なのです。

引き続き、回答を受け付けますので、よろしくお願いします。

2005/10/26 20:26:35

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません