mySQLデータベース入門(トランザクション)

20761 ワード

SQL文
  • データ定義言語(DDL Data Definition Language):データベース内のテーブル、ビュー、インデックスなどのオブジェクトを作成、変更または削除する操作で、create、alter、dropのコマンドが一般的です.
  • /*  :
    create database      [ character set     ] */
    create database student character set utf8
    /*   :*/
    create table student(
    	id char(12),
    	name varchar(20),
    	mobile char(11),
    	address varchar(30)
    )
    
    /*  :
    drop database      */
    drop database student
    
    /*  :
    alter database      character set   */
    alter database student character set utf8
    
  • データ問合せ言語(DQL Data Query Language):既存のデータベース内のデータを指定した組合せ、条件式またはソートで取得し、データベース内のデータを変更せずに、通常のコマンドはselectです.
  • /*  :
    select from student [where ='']*/
    delete from student where id='001'
    
    /*           select database()*/
    select database()
    
    /*  MySQL             :show databases*/
    show database
    
    /*            :show create database     */
    show create database
    
  • データ操作言語(DML Data Manipulation Language):テーブルにデータ操作を追加、削除、変更し、insert、update、deleteのコマンドが一般的です.
  • /*    */
    delete from student where id='001'
    
    /*    */
    update student set name='Jim',mobile='13528375637' where id='002'
    
    /*    */
    insert into student (id,name,mobile,address) value('001','Jack','13526509597','henan')/*      */
    insert into student value('002','Make','18703628548','zhengzhou')/*        */
    
  • データ制御言語(DCL Data Control Language):データベースにアクセスする特権の付与または回収、データ操作トランザクションの発生時間および効果の制御、データベースの監視などの操作に使用され、GRANT、REVOKE、COMMIT、ROLLBACKが一般的なコマンドである.
  • rollback;
    commit;
    

    取引
    トランザクションの4つの特性(ACID):
  • 原子性(Atomicity):化学中の原子は再分割できない基本微粒子を指し、データベース中の原子性はトランザクションが分割できない全体であることを強調し、トランザクションが開始された後、すべての操作がすべて成功するか、すべて失敗するか、中間のあるループに停滞することはできない.トランザクションの実行中にエラーが発生すると、トランザクションが開始される前の状態にロールバックされ、すべての操作は発生しないようにデータベースに影響を与えません.
  • コンシステンシ(Consistency):トランザクションは、データベースを1つのコンシステンシ状態から別のコンシステンシ状態に変換する必要があります.つまり、1つのトランザクションが実行される前と実行される後はコンシステンシ状態にする必要があります.振り込みについて言えば、仮にユーザーAとユーザーBの両方のお金を合わせて5000とすると、AとBの間でどのように振り込んでも、何回振り込んでも、事務が終わった後に2人のユーザーのお金を合わせても5000となるべきで、これが事務の一致性です.
  • 独立性(Isolation):複数のユーザーが同時にデータベースにアクセスする場合、例えば同じテーブルを操作する場合、データベースは各ユーザーが開いているトランザクションであり、他のトランザクションの操作に干渉されてはならない.複数の同時トランザクション間は互いに隔離されなければならない.例えば、Aが1枚の銀行カードからお金を引き出している場合、Aがお金を取る過程が終わる前に、Bはこのカードにお金を振り込むことができない.
  • 永続性(Durability):トランザクションがコミットされると、データベースのすべての更新がデータベースに保存され、ロールバックできません.

  • トランザクションの完了:(転送と転送は、残高データの変更に同時に成功する必要があります.いずれかが成功しない場合は、データベースの内容は変更されません)
    Navicat Premiumによる操作:
    #         
    create table account(
      id char(36) primary key,
      card_id varchar(20) unique,
      name varchar(8) not null,
      money float(10,2) default 0
    );
    
    insert into account values('6ab71673-9502-44ba-8db0-7f625f17a67d','1234567890','  ',1000);
    insert into account (id,card_id,name) values('9883a53d-9127-4a9a-bdcb-96cf87afe831','0987654321','  ');
    select * from account
    
    update account set money=money-100 where card_id='1234567890';
    update account set money=money+100 where card_id='0987654321';
    select * from account
    
    update account set money=money-100 where card_id='1234567890';
    update account set money=money+100 where card_d='0987654321';
    select * from account
    
    #  :   sql           ,     sql           
    set autocommit=0;#       sql         
    update account set money=money-100 where card_id='1234567890';
    update account set money=money+100 where card_d='0987654321';
    commit;#    
    rollback;#    
    select * from account
    

    Javaによる操作:
    package com.jd.test;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class Test {
    
    	public boolean batch(String...sqls) {
    		Connection connection = null;
    		try {
    			Class.forName("com.mysql.jdbc.Driver");//1、    
    			String url = "jdbc:mysql://127.0.0.1:3306/test";
    			connection = DriverManager.getConnection(url ,"root","root");//2、    
    			connection.setAutoCommit(false);//3、      
    			Statement statement = connection.createStatement();//4、  sql  
    			for (String sql : sqls) {
    				statement.addBatch(sql);
    			}
    			statement.executeBatch();//5、  sql  
    			connection.commit();//6、    
    			return true;
    		} catch (Exception e) {
    			try {
    				if (connection!=null) {
    					connection.rollback();//7、     ,     
    				}
    			} catch (SQLException e1) {
    				e1.printStackTrace();
    			}
    			e.printStackTrace();
    		}
    		return false;
    	}
    	
    	public static void main(String[] args) {
    		if(new Test().batch("update account set money=money-100 where card_id='1234567890'","update account set money=money+100 where card_id='0987654321'")) {
    			System.out.println("Yes");
    			return;
    		}
    		System.out.println("No");
    	}
    }