狠狠撸

狠狠撸Share a Scribd company logo
データベース入门(第3回)
前回のあらすじ。
データベースを使うためにはSQLという言葉を使います。
そのSQLにはDDL、DML、DCLといった種類がありました。
テーブルを作るときなどはDDLである、CREATE文なども使いますが、
データベースのテーブルの中のデータを操作するのに使うのは主に、
DMLである、SELECT、INSERT、UPDATE、DELETEでしょう。
そしてこれらと密接にかかわってくるのが、COMMIT、ROLLBACKなどの
DCLの存在です。
今日はこの、COMMITやROLLBACKによってできることを
ざっくりと、説明します。
トランザクションとは。
トランザクション。
そもそもトランザクションという言葉は、データベースの世界だけの言葉では
ありません。
いろいろな分野で、トランザクションという単語が使われています。
今回のトランザクションというのは、あくまで
「データベースの世界」に閉じた話だということを頭の片隅に
置いていてください。
また、トランザクションにはロックという概念、
「鍵をかけてほかの人が触れないようにする」といった意味合いの言葉が
密接に絡んでくるのですが、この話も時間がかかるので割愛します。
トランザクションの定義。
データベースとしてのトランザクションの定義としては、おおまかに以下のよ
うに書くことができます。
1)複数のデータの登録や削除や更新をすべて有効なものとする(これを「コ
ミットする」といいます)、もしくはすべて無効なものとして元の状態に戻す
(これを「ロールバックする」といいます)といった、半分だけ登録されてい
るといった中途半端な状態にならないようにするための機能
2)ほかの人の操作からの影響を防ぐ(Aさんが編集中のデータをBさんは編
集できない、または見ることもできない)
2のほうは、データベースにかかわらず、ネットワーク共有フォルダのExcel
ファイルを複数人で開いたときのことを考えると、わかりやすいかもしれませ
ん。
意味不明なので。
1)複数のデータの登録や削除や更新をすべて有効なものとする、もしくはす
べて無効なものとして元の状態に戻す
というのは、
Aさん「トランザクション開始!」
Aさん「1のデータをデータベースに登録したよ!」
Aさん「2のデータを消したよ!」
Aさん「トランザクション完了!(コミット!)」
?こうすると、1のデータが登録され、2のデータが削除された状態で確定に
なります。
つまり、Excelなどで考えれば、いろいろ書いて、シートも1つ消して、保存
ボタン押してExcelを終了したら、書いた内容は保存されていて、削除した
シートもなくなっている状態になっているということです。
意味不明なので。
1)もしくはすべて無効なものとして元の状態に戻す
というのは、
Aさん「トランザクション開始!」
Aさん「1のデータをデータベースに登録したよ!」
Aさん「2のデータを消したよ!」
Aさん「やっぱやめ!(ロールバック!)」
?こうすると、1のデータは登録されず、2のデータも削除されていない状態
に戻った状態になります。
つまり、Excelなどで考えれば、いろいろ書いて、シートも1つ消したけど、
保存しないでExcelを終了しちゃったら、書いた内容はなくなっちゃうし、
シートも削除されていない状態に戻っちゃう、ということです。
意味不明なので。
2)ほかの人の操作からの影響を防ぐ(Aさんが編集中のデータをBさんは編
集できない、または見ることもできない)
というのは、
Aさん「トランザクション開始!」
Aさん「1のデータを変更したよ!」
Bさん「1のデータを見よう!でもなんか変更できない!」
Bさん「なら、2のデータを見よう!みれた!」
Aさん「2のデータを消したよ!」
Aさん「トランザクション完了!(コミット)」
Bさん「もう一度検索しよう。あれ?1のデータが変わってる?」
Bさん「あれ?2のデータがない!」
?このように、1のデータは変更され、2のデータは削除された状態になりますが、A
さんがトランザクションを完了(コミット)した場合は、Bさんは開いているときは見
えたままですが、SELECTを再実行すると変更後の状態が見えるようになります。
よくある説明。
トランザクションの説明でよく出てくる例が、銀行の口座振込みの例です。
例えば、Aさんの口座からBさんの口座に、50万円を振り込みました、
って時の場合、Aさんの口座から50万円引くのは正常に終わったけど、
Bさんの口座に50万円移すときに障害が起こって、Bさんの口座には50万
円は入らなかった。。。。Aさんは大損ですね。
それをなくすためには。
この振込みをする前に、
「トランザクション開始!」と叫んでみましょう。
「Aさんの口座からの引落?Bさんの口座への入金」という一連の流れを
トランザクションのなかで行うということです。
そうすれば、Bさんに入金失敗しても、魔法の呪文「ロールバック!」を唱え
れば、Aさんの口座にはお金が戻ってきます。
ACID特性。
ちょっと難しい言葉と話になりますが、
トランザクションはACID特性を持っています。
Atomicity(原子性):トランザクションは実行が完了するか、あるいはまっ
たく実行されないかのどちらかとなる
Consistency(整合性):トランザクションの開始と終了時には、データベー
スは整合性を保った状態となっている
Isolation(分離性):トランザクションは別のトランザクションの影響を受け
ない
Durability(持続性):トランザクションが正常に完了し、変更が確定された
データは確実に保持される
先ほどの銀行口座のお話も、これらを満たしていると、正しく処理が行われる
ことになります。
ACID特性。
?原子性
もし2の処理を行った時点でトランザクションが終了した場合、Aさんの口座から
1000円が引かれただけの状態になってしまいます。原子性はこういった中途半端な状
態になることを防ぎます
?整合性
もし2の処理で間違ってAさんの口座から20000円を引いてしまい、3の処理でBさ
んに20000円正常に足してしまった場合、トランザクション終了時にAさんはマイナ
スの残高となってしまいます。これはありえないので、正しくない状態になることを防
ぎます
1振り込み開始前 Aさんの口座10000円、Bさんの口座5000円
2Aさんの口座から1000円引く Aさんの口座9000円、Bさんの口座5000円
3Bさんの口座に1000円足す 础さんの口座9000円、叠さんの口座6000円
ACID特性。
?分離性
2の処理中に、Aさんとは別にCさんがBさんの口座に1000円振り込んだ場合、Bさ
んの残高は6000円となります。それとは別に2の処理の後にAさんの振込みの結果と
して、Bさんの残高を6000円で上書きしてしまうような状況が発生すると、本来はC
さんからの振込みが1000円、Aさんからの振込みが1000円でBさんの残高が7000
となるところが6000円になってしまいます。
分離性はこのようにトランザクションが別のトランザクションの影響を受けてしまうこ
とを防ぎます。
?持続性
完了したトランザクションが消失してしまった場合、どのトランザクションをやり直す
のか判別して再度やり直すのかを判別し、場合によっては再度実行する必要があります。
持続性は、完了したトランザクションの結果は消失するのを防ぎます。
1振り込み開始前 Aさんの口座10000円、Bさんの口座5000円
2Aさんの口座から1000円引く Aさんの口座9000円、Bさんの口座5000円
3Bさんの口座に1000円足す 础さんの口座9000円、叠さんの口座6000円
出てくるコマンド。
トランザクションに関係するSQLとしては、
トランザクションの開始と終了を自分で宣言する場合に使う、
BEGIN(TRANSACTION)、START TRANSACTION、
トランザクションを終了して変更などを確定するCOMMIT、
トランザクションを中止して変更などをなかったことにして元の状態に戻す
ROLLBACKなどがあります。
データベースの種類によってはトランザクション開始を宣言しなくても、
勝手に始まって、勝手に終了するものもあります。
勝手に始まる場合、暗黙のトランザクションといって、
裏でトランザクションが使われているような感じです。
コミットしたら確定して保存される。
Excelでも、保存ボタンをクリックしたら、編集した内容がファイルに保存さ
れます。一度保存したら、そのファイルを削除しない限り、ずっと残ります。
データベースもこれと同じです。
COMMITを実行したら、データベースに変更した内容が保存されます。
データベースの内部では、このCOMMITのタイミングで裏でいろいろ小人さ
んが作業をしているのですが、
その内容はOracle、PostgreSQL、MySQL、SQLServerなどで
やっていることが違います。
でも、使う人はとりあえず、COMMITしたら保存が確定する、と覚えておけ
ばいいかなと思います。
ロールバックしたらもとにもどる。
Excelでも、保存さえしなければ、閉じて開きなおしたら、元の状態に戻りま
すし、「CTRL+Z」キーで、たいていのアプリケーションは1つ前の状態に
戻ります。データベースと同じようなことをしています。
なぜ戻れるかといえば、変更した情報をすべて保存しているので、
なにをやったかが記録されていて、戻すときは保存した場所から古い情報を
もってきて、昔の状態にもどすということです。
なにを変更したか記録を保存する方法や、保存している場所は、
データベースによって仕組みが違います。
やり直したい、元に戻したい、というときは、とりあえずロールバックすれば
いいと覚えておけばいいかなと思います。
ただし、一度でもコミットしてしまったら、そこまでしかもどりません!
まとめ。
?トランザクションはDBが標準的に持っている機能です。
?トランザクション開始~コミットまたはロールバックで、一つのトランザク
ションが成立します。
?確定するか、なかったことにするか、そのどちらかの状態しかありません。
?コマンドは細かい違いはあれど、OracleでもMySQLでもPostgreSQLでも
かわりません。COMMITとROLLBACKは存在します。
?COMMITは保存、ROLLBACKは全部取り消し、みたいなものです。
?プログラムを作るときは、自動的にトランザクション制御をやってくれる場
合もあります。
?もちろん自分でトランザクション開始処理やCOMMIT処理を書かなければ
ならない場合もあります。
?プログラムによるトランザクション制御の違いは、実際に使うときに覚えて
ください。
つぎ。
次回は、SQLの関数や文法などを掘り下げるか、
インデックスなどのデータベース内のオブジェクト
について話すか、検討中です。
ご清聴ありがとうございました。
Ad

Recommended

テ?ータヘ?ース入门
テ?ータヘ?ース入门
拓 小林
?
SQL Server 入門
SQL Server 入門
Tsuyoshi Kitagawa
?
データベース入门1
データベース入门1
tadaaki hayashi
?
名古屋アジャイル勉强会「春のアジャイル入门」
名古屋アジャイル勉强会「春のアジャイル入门」
hiroyuki Yamamoto
?
テストを书こう!!
テストを书こう!!
拓 小林
?
データベース入门2
データベース入门2
tadaaki hayashi
?
Phpcon2015
Phpcon2015
Hiroshi Tokumaru
?
サルでもわかるディープラーニング入門 (2017年) (In Japanese)
サルでもわかるディープラーニング入門 (2017年) (In Japanese)
Toshihiko Yamakami
?
DB2の使い方 管理ツール編
DB2の使い方 管理ツール編
Akira Shimosako
?
データベース技術 3(Database_3)
データベース技術 3(Database_3)
Yuka Obu
?
Transaction description how to use it in laravel
Transaction description how to use it in laravel
yoshitaro yoyo
?
データベース12 - トランザクションと同時実行制御
データベース12 - トランザクションと同時実行制御
Kenta Oku
?
20151120_ビッグデータ/クラウドにデータ連携自由自在 “オンプレミス ? クラウド ? クラウド” by 株式会社インサイトテクノロジー 森田俊哉
20151120_ビッグデータ/クラウドにデータ連携自由自在 “オンプレミス ? クラウド ? クラウド” by 株式会社インサイトテクノロジー 森田俊哉
Insight Technology, Inc.
?
データベースシステム论13 - データベースの运用
データベースシステム论13 - データベースの运用
Shohei Yokoyama
?
Study 20131009
Study 20131009
fujii_t
?
Oracle Databaseを用いて学ぶ RDBMSの基本 (抜粋版) - JPOUG Oracle Database入学式 2016
Oracle Databaseを用いて学ぶ RDBMSの基本 (抜粋版) - JPOUG Oracle Database入学式 2016
Ryota Watabe
?
[B31] LOGMinerってレプリケーションソフトで使われているけどどうなってる? by Toshiya Morita
[B31] LOGMinerってレプリケーションソフトで使われているけどどうなってる? by Toshiya Morita
Insight Technology, Inc.
?
データベース13 - トランザクションと障害回復
データベース13 - トランザクションと障害回復
Kenta Oku
?
奥别产アプリケーション入门(3)
奥别产アプリケーション入门(3)
Takashi Asanuma
?
データを追っかけよう!
データを追っかけよう!
Oda Shinsuke
?
[db tech showcase Sapporo 2015] B15:ビッグデータ/クラウドにデータ連携自由自在 (オンプレミス ? クラウド ? クラ...
[db tech showcase Sapporo 2015] B15:ビッグデータ/クラウドにデータ連携自由自在 (オンプレミス ? クラウド ? クラ...
Insight Technology, Inc.
?
Seas で語られたこととは?
Seas で語られたこととは?
Masayuki Ozawa
?
CLUB DB2 第122回 DB2管理本の著者が教える 簡単運用管理入門
CLUB DB2 第122回 DB2管理本の著者が教える 簡単運用管理入門
Akira Shimosako
?
MySQL(RDB)入門 => PHPでアクセス
MySQL(RDB)入門 => PHPでアクセス
Kimiyuki Yamauchi
?
やってはいけない空振り顿别濒别迟别
やってはいけない空振り顿别濒别迟别
Yu Yamada
?
2019年度 若手技術者向け講座 DBMSの機能
2019年度 若手技術者向け講座 DBMSの機能
keki3
?
Online schema change_for_mysql_casual
Online schema change_for_mysql_casual
Naritoshi Hayashi
?

More Related Content

Similar to データベース入门3 (20)

DB2の使い方 管理ツール編
DB2の使い方 管理ツール編
Akira Shimosako
?
データベース技術 3(Database_3)
データベース技術 3(Database_3)
Yuka Obu
?
Transaction description how to use it in laravel
Transaction description how to use it in laravel
yoshitaro yoyo
?
データベース12 - トランザクションと同時実行制御
データベース12 - トランザクションと同時実行制御
Kenta Oku
?
20151120_ビッグデータ/クラウドにデータ連携自由自在 “オンプレミス ? クラウド ? クラウド” by 株式会社インサイトテクノロジー 森田俊哉
20151120_ビッグデータ/クラウドにデータ連携自由自在 “オンプレミス ? クラウド ? クラウド” by 株式会社インサイトテクノロジー 森田俊哉
Insight Technology, Inc.
?
データベースシステム论13 - データベースの运用
データベースシステム论13 - データベースの运用
Shohei Yokoyama
?
Study 20131009
Study 20131009
fujii_t
?
Oracle Databaseを用いて学ぶ RDBMSの基本 (抜粋版) - JPOUG Oracle Database入学式 2016
Oracle Databaseを用いて学ぶ RDBMSの基本 (抜粋版) - JPOUG Oracle Database入学式 2016
Ryota Watabe
?
[B31] LOGMinerってレプリケーションソフトで使われているけどどうなってる? by Toshiya Morita
[B31] LOGMinerってレプリケーションソフトで使われているけどどうなってる? by Toshiya Morita
Insight Technology, Inc.
?
データベース13 - トランザクションと障害回復
データベース13 - トランザクションと障害回復
Kenta Oku
?
奥别产アプリケーション入门(3)
奥别产アプリケーション入门(3)
Takashi Asanuma
?
データを追っかけよう!
データを追っかけよう!
Oda Shinsuke
?
[db tech showcase Sapporo 2015] B15:ビッグデータ/クラウドにデータ連携自由自在 (オンプレミス ? クラウド ? クラ...
[db tech showcase Sapporo 2015] B15:ビッグデータ/クラウドにデータ連携自由自在 (オンプレミス ? クラウド ? クラ...
Insight Technology, Inc.
?
Seas で語られたこととは?
Seas で語られたこととは?
Masayuki Ozawa
?
CLUB DB2 第122回 DB2管理本の著者が教える 簡単運用管理入門
CLUB DB2 第122回 DB2管理本の著者が教える 簡単運用管理入門
Akira Shimosako
?
MySQL(RDB)入門 => PHPでアクセス
MySQL(RDB)入門 => PHPでアクセス
Kimiyuki Yamauchi
?
やってはいけない空振り顿别濒别迟别
やってはいけない空振り顿别濒别迟别
Yu Yamada
?
2019年度 若手技術者向け講座 DBMSの機能
2019年度 若手技術者向け講座 DBMSの機能
keki3
?
Online schema change_for_mysql_casual
Online schema change_for_mysql_casual
Naritoshi Hayashi
?
DB2の使い方 管理ツール編
DB2の使い方 管理ツール編
Akira Shimosako
?
データベース技術 3(Database_3)
データベース技術 3(Database_3)
Yuka Obu
?
Transaction description how to use it in laravel
Transaction description how to use it in laravel
yoshitaro yoyo
?
データベース12 - トランザクションと同時実行制御
データベース12 - トランザクションと同時実行制御
Kenta Oku
?
20151120_ビッグデータ/クラウドにデータ連携自由自在 “オンプレミス ? クラウド ? クラウド” by 株式会社インサイトテクノロジー 森田俊哉
20151120_ビッグデータ/クラウドにデータ連携自由自在 “オンプレミス ? クラウド ? クラウド” by 株式会社インサイトテクノロジー 森田俊哉
Insight Technology, Inc.
?
データベースシステム论13 - データベースの运用
データベースシステム论13 - データベースの运用
Shohei Yokoyama
?
Study 20131009
Study 20131009
fujii_t
?
Oracle Databaseを用いて学ぶ RDBMSの基本 (抜粋版) - JPOUG Oracle Database入学式 2016
Oracle Databaseを用いて学ぶ RDBMSの基本 (抜粋版) - JPOUG Oracle Database入学式 2016
Ryota Watabe
?
[B31] LOGMinerってレプリケーションソフトで使われているけどどうなってる? by Toshiya Morita
[B31] LOGMinerってレプリケーションソフトで使われているけどどうなってる? by Toshiya Morita
Insight Technology, Inc.
?
データベース13 - トランザクションと障害回復
データベース13 - トランザクションと障害回復
Kenta Oku
?
奥别产アプリケーション入门(3)
奥别产アプリケーション入门(3)
Takashi Asanuma
?
データを追っかけよう!
データを追っかけよう!
Oda Shinsuke
?
[db tech showcase Sapporo 2015] B15:ビッグデータ/クラウドにデータ連携自由自在 (オンプレミス ? クラウド ? クラ...
[db tech showcase Sapporo 2015] B15:ビッグデータ/クラウドにデータ連携自由自在 (オンプレミス ? クラウド ? クラ...
Insight Technology, Inc.
?
Seas で語られたこととは?
Seas で語られたこととは?
Masayuki Ozawa
?
CLUB DB2 第122回 DB2管理本の著者が教える 簡単運用管理入門
CLUB DB2 第122回 DB2管理本の著者が教える 簡単運用管理入門
Akira Shimosako
?
MySQL(RDB)入門 => PHPでアクセス
MySQL(RDB)入門 => PHPでアクセス
Kimiyuki Yamauchi
?
やってはいけない空振り顿别濒别迟别
やってはいけない空振り顿别濒别迟别
Yu Yamada
?
2019年度 若手技術者向け講座 DBMSの機能
2019年度 若手技術者向け講座 DBMSの機能
keki3
?
Online schema change_for_mysql_casual
Online schema change_for_mysql_casual
Naritoshi Hayashi
?

データベース入门3