2016年3月9日水曜日

SQL ServerのLinux版が出るのか

SQL ServerのLinux版が出るみたい。次の記事に書いてある。

Microsoft、SQL ServerのLinux版を提供

てか、SQL ServerがLinux版で使えてなんかいいことあるのか?他のRDBと比べてなんかいいことあるのか?性能とかセキュリティとかで勝るものがあるならいいが、そんなこと聞いたことないし、過去にWindows環境でSQL ServerをDBMSで、開発してた時に苦労したんだが、初期設定で、ダーティーリードが有効じゃないんだよ。お互いのトランザクションがSQLのUPDATEでなくて、デットロックが発生するんだよ。つまりこんな感じ。

トランザクションで、データAとBを更新しようとした場合に
端末1はデータA、Bの順番でデータを更新しようとして、うまくいけばデータを更新完了としたいのだが、端末2がデータB、Aの順番でデータを更新しようとして、うまくいけばデータ更新完了とした場合に

(1)端末1 データAを更新(UPDATE)して、データAをロック。で、データBを更新しようとするが、
その前に…
(2)端末2 データBを更新(UPDATE)して、データBをロック。で、データAを更新しようとするが、データAがロックされているので、待ちのままになって、デッドロックが発生する。

となり、このような場合は、お互いがUPDATEを行うとデッドロックが発生する。これは普通に発生するデッドロックだ。
だけど、SQL Serverだと、お互いがUPDATEを行う場合でなくても、片方がUPDATEで、片方がSELECTでもデッドロックが発生するんだ。
なぜかというと、ダーティリードが初期設定で、有効になってないからだ。
ダーティリードって、UPDATE行った時に、更新完了(トランザクション終了)までの間に、更新をおこなった自分自身以外は、更新以前の内容のデータを取り扱えるようにする。(更新前のデータを、どこかに退避しておいて、更新をおこなった自分以外に更新前のデータを参照できるようにする。)そのようにして、更新中のデータのロック待ちを防ぐことができる。

だけど、SQLServerはそのダーティーリードが初期設定で有効になってないせいで、デッドロックが発生して、調査にすごく時間がかかった思い出がある。
SQLServerはの初期設定で、READ_COMMITTED_SNAPSHOTがOFFになっている。ダーティーリードを有効にしたければ、READ_COMMITTED_SNAPSHOTをONにさせる。
多分、READ_COMMITTED_SNAPSHOTをONにすると、更新前のデータを更新データと別に退避する必要があり、負荷がかかるので、SQL Serverでは初期設定で、READ_COMMITTED_SNAPSHOTをOFFにして、負荷を軽減していると思う。

自分はRDBを使用してたのが、Oracleばっかりで、ダーティーリードが当たり前だったので、SQL ServerでUpdateとSelectでデッドロックが発生した時は、信じられなかったし、調査に苦労したよ。



0 件のコメント :

コメントを投稿