データベースプログラミング全般スレ

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
NGNG
データベース板もあるが、あそこは過疎板だからこっちに立てました。
データベース関連のプログラミングならな〜んでもOK。
色んな話をしませまうる号。
2014/11/06(木) 21:40:39.96ID:6jrte84K
>>403
数百や数千なら個別に作るけどな
定食なら日本全国のを集めても数千も無いだろうしwww
405デフォルトの名無しさん
垢版 |
2014/11/07(金) 07:02:18.20ID:QVJdWUqC
>>403

BOMとか部品表とかで色々調べるとよいかも。
テーブルの使い方次第だけど、定食が1日に100百食作る予定だから、
あらかじめ材料を何キロ買っておく、みたいな使い方をするなら、
12月1日からのA定食の構成要素をはこれとこれを含むという
適用範囲を持ったテーブルになると思う。

まぁ、テーブルの使い方によって設計が変わるはず
2015/02/14(土) 22:52:28.31ID:WlrY+q6b
C# で、System.Data.SQLite を利用しているのですが、
データベースファイル内のテーブルの数、ないしテーブル一覧を取得するにはどうすれば良いでしょうか?
407デフォルトの名無しさん
垢版 |
2015/02/15(日) 09:08:49.39ID:lVCsB9EK
.schama
2015/02/15(日) 09:31:44.71ID:twE3uD4t
長いことIT業界にいるが、
いまだに排他制御が完全なシステムを
作ってるのに出会ったことがない・・・

俺自身、どのレベルで何をどうしたら
完璧になるのか良く分かってないしな。
2015/02/15(日) 09:59:39.37ID:Mh0LkIrH
DBアクセスのたびにDB全体を完全ロックすれば完璧だよ!
2015/02/15(日) 11:36:22.84ID:24ypMGtK
DB用に専用線を引いて、通信を暗号化すれば完璧だよ
411デフォルトの名無しさん
垢版 |
2015/02/15(日) 11:59:28.83ID:iz0G57zc
入力時点でシリアル化しとけば排他制御いらんな。
2015/02/15(日) 12:18:07.77ID:n2M7TY52
>>408
汎用機のオンラインシステムは完璧な排他制御を求められたんだがな。
2015/02/15(日) 13:31:12.71ID:SSlwb3yD
RDBなら本来、アプリケーション側で排他制御なんかしないよな。
2015/02/15(日) 13:41:39.84ID:Mh0LkIrH
DBにとって必要な整合性と、アプリにとって必要な整合性は違うのだよ
2015/02/15(日) 16:14:21.62ID:bX6frV1s
HTTPとの相性最悪
2015/02/15(日) 17:18:02.87ID:62ZsaQxV
素人乙
2015/02/15(日) 18:14:23.37ID:n2M7TY52
>>413
データベースが勝手に排他制御をしてくれるとでも?
2015/02/15(日) 19:03:52.03ID:SSlwb3yD
当たり前だろ。そうじゃなきゃDBMSの意味がない。
で、普通は明示的な排他制御などやらずに適切なトランザクション分離レベルを宣言するんだが、
わかってない奴が設計するとそこが適切じゃなくて、「この処理の前にこっちのテーブルをロックしなきゃ」
なんてことになる。
2015/02/15(日) 19:06:51.51ID:Mh0LkIrH
レベル宣言だけで上手くいくもんか
2015/02/15(日) 19:10:05.48ID:twE3uD4t
>>418
テーブルに最終更新時間とか持たせて、
表示させた後にDBに書き込むときに、
最終更新時間が取得したときと違ってたら
エラーを表示するとかなんたらって、
ズラズラとコードを書いたりしないか?
2015/02/15(日) 19:57:11.17ID:n2M7TY52
>>418
分離レベルだけで勝手にやってくれるとでも?
2015/02/15(日) 19:59:36.27ID:SSlwb3yD
>>420
ロングトランザクションのために仕方なく読み出しと書き込みを分けるなら、たしかにそういう、
いわゆる楽観的ロックを使う場面もあるね。
その場合は両者のトランザクションは独立したものとして、つまり読み出しがない書き込み
トランザクションにも正しく対応できるよう設計すればいい。
もちろんこれも「排他」制御ではない。
2015/02/15(日) 20:43:21.86ID:n2M7TY52
>>422
そういう同時実行時の不整合を起こさない仕組みも含めたのを排他制御とは言わないのかい?
2015/02/27(金) 10:28:05.63ID:+9m5pWTV
>>419
>>414が良い事言ってる。と思ったら414=419かよw
すくなくとも「DBにとって必要な整合性」は保障されるだろ
>>418が「アプリにとって必要な整合性」をどう考えてるのかは知らんが
>>422あたりを見るに、それは>>418にとっては排他処理ではないらしいから考慮外なんだろう

理想は分離レベルの指定だけですべて済ませればいいんだが
なかなかそう言うわけにはいかないのが現実
2015/02/27(金) 12:40:39.68ID:+8onCSYI
apache hbase 1.0キター
http://sourceforge.jp/magazine/15/02/26/150800
2015/03/10(火) 00:30:56.39ID:4vRVmU8Z
VB ScriptのADOで
Do

Loop
の中に
rs.movenext書き忘れるとなにがおこるの?
427デフォルトの名無しさん
垢版 |
2015/03/10(火) 22:06:12.52ID:umpnsyO6
>>426
同じ行を処理し続けるんじゃないの?
428デフォルトの名無しさん
垢版 |
2015/03/11(水) 10:12:33.26ID:3uN2N73I
rs.delete してればそのうち終わるんじゃね?
429デフォルトの名無しさん
垢版 |
2015/12/31(木) 13:59:49.75ID:QqVhmS8m
LINEスタンプで不労所得を得る!
http://goo.gl/e18Nmy
430デフォルトの名無しさん
垢版 |
2016/01/19(火) 14:37:25.78ID:o7PI7tBC
SQLServerで教えて下さい。
saユーザでログインし、管理者用のDB_Aと、
ユーザ用のDB_Bを作成し、
ユーザ用のユーザを作成しました。
DB_Aにselectするために権限を振りたいのですが、うまくいかないです。
どのようにすればいいですか?
2016/01/20(水) 16:37:02.67ID:NQlxuzeF
データベース板にMSSQLスレあるよ
432デフォルトの名無しさん
垢版 |
2016/01/20(水) 19:46:17.26ID:F8N6o/ie
>>430
どのユーザーでどのユーザー
2016/02/01(月) 00:25:24.43ID:3WuLHwNd
検索の仕方が悪いのか、データベースのデータから特定のx行y列目の値を一つの変数へ格納する方法が見つからない…


コマンドプロンプト上で検索するやり方は特定の行または列だけ。
excelなら行と列を指定すればそのセルの値を取得できるが、他の面で不便だ

SQliteなんだが、特定のx行y列目の値を一つの変数へ格納する方法が知りたい
434デフォルトの名無しさん
垢版 |
2016/02/01(月) 05:21:16.21ID:xBjz7JvU
>>433
変数って何の変数だよ?
2016/02/01(月) 06:09:47.86ID:lA57fNjF
データベースに行数列数なんて概念あんの?
436デフォルトの名無しさん
垢版 |
2016/02/01(月) 06:19:13.75ID:xBjz7JvU
>>435
はあ?

RDBは行列の2次元の表が基本だぞ。
437デフォルトの名無しさん
垢版 |
2016/02/01(月) 06:21:27.24ID:xBjz7JvU
>>433
RDBには行の順番というものはないぞ。
2016/02/01(月) 09:24:33.50ID:teirB2/w
SELECT 文に ORDER BY をつけてようやく順番が決まった表みたいなものになる
数十万、数百万件もあるかもしれないデータをいきなり何行目とか指定できない
順番にfetchするとかカーソル使うとか、、、特定の何番目かの行だけ取り出したければ
LIMIT OFFSET使うとか
2016/02/01(月) 09:32:31.63ID:3WuLHwNd
>>434
>>437
行"数"は無いのか…。

多くのサイトの説明だと

「select カラム from テーブル where 条件」で抽出できる、みたいに書いてある。
けれど抽出したデータを任意に作った変数にどう取り込むのか、までは載ってないんだ…

変数っていうのは、ゲームの例で言えば、
特定のモンスターの能力値を読み込むときに、モンスターに振り分けたIDなりでデータベースを検索して、
攻撃力・守備力・魔法力の数値が全部載ってる行を見つける

けれど、そのまとまった情報をゲーム上のステータスにどう反映すればいいのかがわからない。
攻撃力を表す変数Xに攻撃力の数値を入れたいんだよね。
2016/02/01(月) 13:22:29.13ID:gmWomOLn
レコードを特定して列指定で格納値を取得
さらに列の型に応じてゴニョゴニョする…とこの辺がわかってないのか

C/C++ じゃなくて VBとかスクリプトだと余計なこと考えなくていいんだけど
多分ダメなんだろうな
2016/02/01(月) 15:01:28.17ID:C4njzqYk
>>433
>「select カラム from テーブル where 条件」で抽出できる、みたいに書いてある。
>けれど抽出したデータを任意に作った変数にどう取り込むのか、までは載ってないんだ…

change your mind
わからなければORMでも使えばいい
2016/02/01(月) 19:01:11.15ID:3WuLHwNd
みんなのくれるヒントをもとに検索かけてるんだがやっぱりだめだ……

>>441
ORMというものの説明をさっくり見ても理解できなかった。すまん

>>440
VB.netのほうが取っつきやすいから、そっちのほうで良い方法を載せてるサイトを知らないか?
2016/02/02(火) 00:31:00.26ID:I6GVlLy1
>>442
サブクエリで検索したまえ
2016/02/02(火) 01:49:46.31ID:hbRk5EKW
日を跨いですまん

>>443
これはわかりやすくて使いやすいな。
ただ最も知りたいのは、ここから自分の作った変数へ当て嵌める方法でな…。

たとえば ttp://www.dbonline.jp/mysql/select/index20.htmlの例を使うなら、
サブクエリを使って求めた行のうちのname"〜"の値を、適当な変数Xに入れて X = "〜" としたいんだ。
2016/02/02(火) 02:12:05.74ID:Nia4wB+/
>>442
VB.NETつかうんならADO.NET使えば?
2016/02/02(火) 08:19:43.05ID:8a5xHyeA
変数ってホストの話か?お前らよく付き合うな。言語も環境もなんも書いてないのに。
447デフォルトの名無しさん
垢版 |
2016/02/02(火) 14:44:58.86ID:chGMw9p3
馬鹿には無理
448デフォルトの名無しさん
垢版 |
2016/02/04(木) 18:31:06.37ID:kJqvXS0n
住所氏名電話番号とかいろんなデータに、どんなデータ型が最適かまとめられたリストってありませんか?
2016/02/04(木) 18:57:06.90ID:cZxKqYB+
ありますよ
2016/02/04(木) 20:43:57.05ID:ZPaMq02w
安心してください
451デフォルトの名無しさん
垢版 |
2016/02/04(木) 21:27:28.08ID:gLwjaquz
>>448
全部VARCHAR
452デフォルトの名無しさん
垢版 |
2016/02/04(木) 23:38:59.91ID:DpQoYKor
ipaが共通語彙基盤とかいうのやってるね
2016/02/05(金) 07:24:45.41ID:z5njROW4
何それ不安しかない
454デフォルトの名無しさん
垢版 |
2016/02/16(火) 22:06:45.67ID:C4gEAWu1
質問なんですが、
accessはもちろんofficeすらインストールしていないpcで、
vs2015から、mdbファイルを利用できます
またaccessをデータセットとして利用できます
これ何ででしょうか?
もしかしてvs2015には、もれなくaccessもついてくるのかな?
当方、日曜プログラマです
上記は、JRAVAN,datalab競馬ソフト開発体験教室レッスン7を実行した結果です
http://jra-van.jp/dlb/sdv/trial.html
455454
垢版 |
2016/02/16(火) 22:15:23.66ID:C4gEAWu1
いや、日曜プログラマだと語弊があるかもしれない
日曜日に趣味で勉強しているおっさんです
プログラマではないです
2016/02/17(水) 00:01:04.23ID:SSk10E0a
accessという製品はタダでは付いてきません
mdbにアクセスするためのプロバイダはoffice無しでも利用できます
457デフォルトの名無しさん
垢版 |
2016/02/17(水) 00:57:40.92ID:MF/QCRL8
>>456
レスども
やっぱりaccessはないわけですか
あれ有料ですもんね
ありがとうございました
2016/02/17(水) 07:18:01.15ID:MgT/kZYs
LibreOffice を使えば?
459デフォルトの名無しさん
垢版 |
2016/02/17(水) 13:21:34.95ID:MF/QCRL8
>>458
accessとbaseの互換性がいまいちわからないんですよね
mdbファイルは開けるけど
現状dbはほぼ未経験、accessもbaseも未経験
adoの勉強始めたとこですね
選択肢の1つとして考えときます
ありがとうございます
2016/02/17(水) 22:15:55.38ID:xErgmETY
libreOfficeっていけてるデータプロバイダあんの?
2016/02/18(木) 12:58:46.87ID:S96kZ0X7
>>454
テーブルで RDB したいだけだったら Access は不要
2016/02/18(木) 13:00:40.69ID:S96kZ0X7
>>460
libreOffice から mdb にリンクするのが吉
463454
垢版 |
2016/02/19(金) 22:28:46.73ID:zOCPbD4l
>>461
そうみたいですね
Accessは入ってるけど、機能制限がかかってる感じなのかな
2016/02/21(日) 10:39:25.91ID:zmvsu5mb
>>463
Accessは入ってない
465デフォルトの名無しさん
垢版 |
2016/02/26(金) 19:25:15.74ID:7ZwiQuKz
Access2016のダウンロード版のダウンロードサイズが1kbということは、
機能はwindowsに入ってんのかね?1kbはライセンスだけだよな
2016/02/26(金) 21:13:28.84ID:jCv12aZp
再配布用のランタイムだけでも300MBくらいあるべ
https://www.microsoft.com/en-us/download/details.aspx?id=50040
2016/02/26(金) 21:30:46.59ID:/FtM6vZD
>>465
Webインストーラーでしょ
2016/03/03(木) 17:58:33.89ID:PglFNqeT
このスレ12年も存在し続けてるのかw
2016/08/25(木) 16:35:33.34ID:f1qIuq6X
質問失礼します。

以下の順番でレコードの重複回避処理を行っています。

@ A.php で Z テーブルの X カラムの値が 49 のレコードを select してレコードの存在チェックを行う。

A @で存在しなければ、A.php で Z テーブルの X カラムの値が 49 のレコードを insert する。

今日、上司からAで insert している最中に他の A.php が走り、

2回レコードが insert されてしまう(つまりレコードが重複してしまう)可能性があるんじゃないの?って聞かれました。

そういう事は考えられるのでしょうか?

またそれを回避するにはどういう SQL 文(トランザクションでしょうか?)を書いたら良いのでしょうか?

分かる方、よろしくお願いします。
470469
垢版 |
2016/08/25(木) 16:41:17.60ID:f1qIuq6X
すいません。
開発環境を忘れてました。
php7.0.6
MySQL5.6
よろしくお願いします。
471469
垢版 |
2016/08/25(木) 16:46:28.67ID:f1qIuq6X
すいません。また補足です。

Z テーブルの X カラムにユニーク属性は付けていません。

他にもカラムがあって設計上付けないことになっています。
2016/08/25(木) 16:48:36.83ID:9o9g1zI8
>>469
> そういう事は考えられるのでしょうか?
考えられる。

> またそれを回避するにはどういう SQL 文(トランザクションでしょうか?)を書いたら良いのでしょうか?
Z.Xにユニーク制約をつけるのが一番簡単。
2016/08/25(木) 16:52:28.51ID:9o9g1zI8
>>471
> Z テーブルの X カラムにユニーク属性は付けていません。
そうなんだ。
じゃ最適解はわからない。テーブルロックか?
2016/08/25(木) 21:09:39.15ID:KSci4OQ9
@とAをSerializableなトランザクションでやればいい。
2016/08/26(金) 15:10:39.88ID:UM2x8X0F
>>474
それでは無理
2016/08/26(金) 20:31:32.61ID:dDBcLzC2
できるだろ。
SERIALIZABLEの意味わかってるか?
2016/08/29(月) 14:33:26.91ID:SnTWW0f8
>>476
こういうケースで問題がある。

table t: (a integer, b integer)
user1がa=3のレコードを、user2がa=4のレコードを同時に作成しようとする。
本来なら、別のデータを登録する処理なので、両立すべき。

user1: set tx_isolation = serializable;
user1: begin;
user1: select count(*) from t where a=3; -> データがないことを確認できる
user2: set tx_isolation = serializable;
user2: begin;
user2: select count(*) from t where a=4; -> データがないことを確認できる
user1: insert into t values(3, 300); -> 処理がブロックする
user2: insert into t values(4, 400); -> エラー発生(Deadlock found)、user1のブロック解除
user2: rollback;
user1: commit;

結果として、user2はデータを登録できない。
2016/08/29(月) 22:22:51.33ID:/ybRo7IQ
>>469の要件は満たしてるのに、

>本来なら、別のデータを登録する処理なので、両立すべき。

なんでこういう条件を勝手に追加するんだか。

しかも、それぞれのトランザクション分離レベルで守らなければならないことと
実装に任されていることとの区別もついていないようだ。


>user2: select count(*) from t where a=4; -> データがないことを確認できる

ここでuser2をブロックあるいは失敗させてuser1を成功させてもSERIALIZABLEの
要件は満たすし、仮にここでブロックする実装なら

>user2: insert into t values(4, 400); -> エラー発生(Deadlock found)、user1のブロック解除

これをエラーにする必要もないんだが。
2016/08/30(火) 10:23:03.89ID:FG8f7euN
>>478
> なんでこういう条件を勝手に追加するんだか。
別に勝手に追加したわけじゃなくて、>>477は普通の正常系の話。
複数人が別々のデータを同時に登録するなら、それは成功してしかるべき。

> これをエラーにする必要もないんだが。
なにか勘違いしてるようだけど、>>478は、
・お互い分離レベルがserializableなtransactionにする
・処理は、「存在確認」→「なければinsert」という処理
を普通に行う実装で、「->」以降はそれを実行した結果。

> >user2: select count(*) from t where a=4; -> データがないことを確認できる
> ここでuser2をブロックあるいは失敗させてuser1を成功させてもSERIALIZABLEの
> 要件は満たすし
serializableの要件を満たすことが目的ではないし、普通に実装すればuser2はブロックしないし
失敗もしない。

> >user2: insert into t values(4, 400); -> エラー発生(Deadlock found)、user1のブロック解除
> これをエラーにする必要もないんだが。
どういう意味?
エラーにするんじゃなくて、エラーが発生するんだけど。
2016/08/30(火) 10:26:02.84ID:FG8f7euN
というか、クライアントを二つ立ち上げて、>>477を実査にやってみれば、俺が言ってることを納得できると思う。
2016/08/30(火) 22:41:53.12ID:d4TkCE35
>別に勝手に追加したわけじゃなくて、>>477は普通の正常系の話。
>複数人が別々のデータを同時に登録するなら、それは成功してしかるべき。

そもそもトランザクションは常に失敗の可能性があるってことすら理解してないのか。
>>469はそんなもの問題として挙げてないし、これが実際に問題となるかどうかはもう少し
具体的にアクセス規模や性能要件なんかを出して議論するものだ。

>serializableの要件を満たすことが目的ではないし、普通に実装すればuser2はブロックしないし
>失敗もしない。
>エラーにするんじゃなくて、エラーが発生するんだけど。

>>478に書いた「実装」ってのはDBMSの実装のことな。
SERIALIZABLEの要件を満たすのもエラーを出すのもDBMS側の仕事。
極端な話、

>user1: select count(*) from t where a=3; -> データがないことを確認できる

安直なDBMならここでtにテーブル排他ロックをかけるかもしれない。それでも規格準拠だ。
それを踏まえてもういちど>>478を読み返してみな。

>というか、クライアントを二つ立ち上げて、>>477を実査にやってみれば、俺が言ってることを納得できると思う。

>>478と同じことを書くけど、おまえさんはSQL標準で規定されたトランザクションの仕様と
個々のDBMSの実装の区別がついていない。
2016/08/31(水) 10:08:49.24ID:csb4seou
>>481
あ、MySQL前提じゃなかったんだね。
じゃ話があわない。
2016/08/31(水) 10:23:23.44ID:csb4seou
標準規格のserializableの話だとして>>478を読み直すと、結論としては>>481はMySQLの分離レベルの
実装はなってないということか?
484469
垢版 |
2016/08/31(水) 20:31:43.28ID:goJly4rw
返答ありがとうございました。

前提条件が不明確でいらぬトラブルを生んでしまったかもしれません。

すいませんでした。


やりたい事をまとめますと「複数同時に実行される A.php で、明確に1レコードだけが挿入されるようにしたい」です。
485469
垢版 |
2016/08/31(水) 20:32:39.61ID:goJly4rw
結局処理は、シリアライズな?トランザクションの使い方も良く分かっていないので以下のように設計しました。

@ Z テーブルの X カラムの値が 49 のレコードが存在するかチェックする(ほとんどの場合はココではじかれる)

A Q テーブルに T レコードが存在していなければ、ユニークなユーザーIDの入った T レコードを挿入する
 INSERT INTO SELECT ?

Bその直後、その T レコードの id (オートインクリメント)の値が一番大きい T レコードを取得する

C T レコードを挿入したのが自分(ユーザーIDでチェックする)ならば、Z テーブルの X カラムの値が 49 のレコードを insert する。

これで A.php が複数同時に走ったとしても一回しか通らないはずです。

大丈夫ですよね?


PDOを利用しています。

要は他スレッド?の A.php による挿入をブロックしなければならないのですが、オーソドックスなやり方を知りたいです。。。


コードが正しいのか、タイミングをほぼ同時にできるかつ自動で微妙に時間をでずらすソフトを作成して、百本ノックならぬ100億本ノックで安全を担保しようとしています。

凄くタコなやり方ですが、これ以外に安全を担保するやり方を知らないので。。。
2016/08/31(水) 21:55:15.56ID:WV/fnjvU
Qテーブルに1レコードしか存在し得ないよう制約がかけられているのならOK。複数挿入できるならNG。
そもそもそんなQテーブルが作れるのなら素直にZにユニーク制約をかけることを検討した方が
いいんじゃないかとは思うが。
あと、ロングトランザクションなら楽観的ロックも仕方ないが、ちゃんとトランザクションの使い方を
学んだ方が後々苦労せずに済むと思うがねぇ。
2016/08/31(水) 22:08:34.19ID:3y45z8zT
そもそもMySQLって、エンジンによってはトランザクションそのものをサポートしてなかった気がするけど
MySQLの排他制御がどうなってるか知らんが、普通に考えれば

テーブル全体に排他ロック獲得
チェック
インサート
テーブルロック解除

でできるんじゃね
同時実効性とかロック待ちで性能低下とか知った事じゃないけどな
2016/09/01(木) 00:33:23.21ID:nGqVI4Wr
>>469
1で存在チェックしてから、2で挿入するって、
1と2の間に、他のプロセスが割り込めるから、典型的なダメパターン。
教科書に書いてある、やっちゃいけない事前問い合わせ

一々、2回もSQL実行するのは無駄。
いきなり、挿入すればいい。
挿入できなければエラーになるだけ

@のような丸囲み文字は、Windowsの環境依存文字だから、使わないように
2016/09/01(木) 04:24:13.09ID:kgZUAtCs
カタカナは日本でしか通じないから
Englishで書いてください
2016/09/01(木) 10:25:48.93ID:lxKZC7pd
>>485
おい、いつのまにか対象とするテーブルが一つから二つに増えてるぞ。
あと、値が49ってなんだよ・・・。

> 大丈夫ですよね?
全然駄目。
すなおにテーブルロックすべし。
491469
垢版 |
2016/09/02(金) 10:39:25.56ID:13McY78U
返答ありがとうございます。

一つ間違っていました。

丸3 の「一番大きい T レコードを〜」は「一番小さい T レコードを〜」でした。

>>486
>Qテーブルに1レコードしか存在し得ないよう制約がかけられているのならOK。複数挿入できるならNG。
複数挿入できないように制約をかけます。
良く分かってないので怖いですが、INSERT INTO SELECT(行が無ければ挿入?)で実現しようとしています。

>>487
テーブルロックは使わない方法でご教授いただければと思います。

>>488
丸2 で「存在していなければ挿入」とするので、丸1 は必要ないのですが、念のために入れてるだけです。

>>490
テーブルロックは使わない方法でご教授いただければと思います。
492469
垢版 |
2016/09/02(金) 10:41:00.77ID:13McY78U
>2回もSQL実行するのは無駄
指摘を受けてハッとしました。
やりたい事を伝え忘れていました。
「Z テーブルの X カラムの値が 49 のレコード」は結果テーブル1行だけというのは変わらないのですが、
その直前にわりと大きめのトランザクションが走ります。
そのトランザクションが複数走るのではと心配になっていました。
トランザクションはまとめて一気に走らせて「何かに失敗したら全部ロールバックできる便利な機能」位しか理解できていません。
仕組みが良く分かっていないので今勉強中です。

2人から同じご指摘いただいているので、普通はテーブルロックで行うって事ですよね。。。
ちょっとそちらも勉強して理解を深めようと思います。

進捗があったらまた書き込ませていただきます。
2016/09/02(金) 11:22:48.43ID:GozEyCoO
>>492
なんか話が変わってきているが、>>469に沿って言えば、Z.Xにユニーク制約を付けるのが「普通」。
あと、トランザクションの大小は関係ない。
3msで終了する「存在チェック→insert」というトランザクションでも、複数人が実行するのなら競合する可能性はある。
2016/09/02(金) 22:39:01.72ID:JARk4f24
>>492
トランザクションを勉強するのはいいが、ロックのことは一旦忘れた方がいい。理解の妨げになる。
明示的にロックを「使う」なんて言うのはトランザクション分離レベルを理解できなかったジジイのやること。
2016/09/05(月) 11:48:06.49ID:Q7D4v3jm
トランザクション分離レベルのことがわかっていると、今回のケースでテーブルロックを使わなくてもいいってことか?
2016/09/05(月) 20:21:03.85ID:EI9/AJWb
今回のケースに限らず、基本的にロックなんて使う必要ない。そもそも標準SQLにロックなんてないしな。
必要があるとすれば、SQL92のトランザクション対応してない古いシステムでどうしてもやらないと
ならない場合とか、全部わかってる人があえて標準じゃできない使い方をする場合くらい。
2016/09/06(火) 03:41:01.52ID:XjpGsw+e
>>494-495
ロックってのは基本的には分離レベルに応じてDBMSが勝手にやってくれる
今回の例ならSERIALIZABLEでトランザクション流せば良いだけ

理想は分離レベルの指定だけで済ますことなんだが
現実的には、どの分離レベルでどういうSQL流したらどういうロックが獲得されるかはちゃんと理解しとかないと
パフォーマンス的な問題がでるかもしれんがな
2016/09/06(火) 07:48:18.17ID:4rtM9TBt
>理想は分離レベルの指定だけで済ますことなんだが
>現実的には、どの分離レベルでどういうSQL流したらどういうロックが獲得されるかはちゃんと理解しとかないと

それは別に相反する話じゃないが。
2016/09/06(火) 11:27:23.34ID:JNt9wvm4
>>497
> 今回の例ならSERIALIZABLEでトランザクション流せば良いだけ
同じテーブルに同時に別のデータをINSERTすることがないという限定条件付きだけどな。

普通は、同じテーブルに同時に別のデータをINSERTすることもあるし、同時に同じデータをINSERTすることもある。
で、同時に同じデータをINSERTされないようにするには、普通はunique制限を付ける。
なんらかの理由でunique制限を付けられない場合は、論理的にはテーブルをロックするしかない。

その「テーブルをロックする」というのが、MySQLで上の限定条件に限り、目的と合致するというだけの話。
2016/09/06(火) 20:19:05.08ID:XjpGsw+e
>>499
お前の言う限定条件ってのは理解できない
だれかに言われてたけど、トランザクションは常に失敗の可能性があるってことすら理解してないのか?
あるいは同時実行されるトランザクションが複数あれば、ロック待ちが発生する可能性があるって事が理解できない?
>>論理的にはテーブルをロックするしかない
だから、SERIALIZABLEなトランザクションってのは必要ならそう言う動作するわけだが
MySQLどうこうじゃなくて、SERIALIZABLEを正しく実装してる全てのDBMSで正しく動作するけど?

MySQLがトランザクションとSERIALIZABLE分離レベルを正しく実装してるかどうかはしらん
2016/09/06(火) 20:56:58.82ID:4rtM9TBt
ロックロック言う奴はやっぱりトランザクション分離レベルが理解できてないという好例>>499
2016/09/07(水) 03:06:30.86ID:09Xqd2ts
>>477がちょっと気になったんだが
本当に先行トランザクションのuser1のinsertがブロックされたり
user2が(ロックタイムアウトじゃなくて)デッドロックで落ちたりするのか?

それがホントなら誰かMySqlのャ鴻bク周りにつb「て詳しい解説ャTイト教えてくb
2016/09/07(水) 03:09:09.50ID:09Xqd2ts
うは、なんか文字化けしとる
MySqlのロック周りについて詳しい解説サイト教えてくれ
と書いたんだが、さて
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況