mysql必知必會(六)


這章介紹數據庫的事務和索引。

1.事務

  • 在mysql中只有使用了InnoDB的數據庫引擎的數據庫或表才支持事務
  • 事務處理可以用來維護數據庫的完整性,保證成批的mysql操作要么完全執行,要么完全不執行
  • 事務用來管理insert、update、delete語句
    事務的術語:
  • 事務(transaction) 指一組sql語句
  • 回滾(rollback)指撤銷指定sql語句的過程
  • 提交(commit)指將未存儲的sql語句結果寫入數據庫中
  • 保留點(savepoint) 指事務中設置的臨時占位符,可以對它進行回滾
    回滾事務:
start transaction;
insert into user(name,password)values('tom','123asd');
rollback;

start transaction;表示開始事務。
提交事務

start transaction;
insert into user(name,password)values('tom','123asd');
commit;

保留點

start transaction;
insert into user(name,password)values('jack','32dsaw');
savepoint s1;
insert into user(name,password)values('rose','545swc');
rollback to s1;

在java的使用:

package com.xinguo.pm.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class TransactionTest {
    public static void main(String[] args) throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db","root","root");

        //開啟事務
        conn.setAutoCommit(false);
        PreparedStatement ps = null;

        try {
            String sql1 = "insert into user(name.password) values(?,?)";
            ps = conn.prepareStatement(sql1);
            ps.setString(1, "jack");
            ps.setString(2,"123456");

            ps.executeUpdate();

            String sql2 = "insert into user(name.password) values(?,?)";
            ps = conn.prepareStatement(sql2);
            ps.setString(1, "rose");
            ps.setString(2,"234567");

            ps.executeUpdate();

            conn.commit();//提交事務
        } catch (Exception e) {
            conn.rollback();//回滾事務
        }

    }
}

開始時設置為不自動提交:conn.setAutoCommit(false);

回滾到保留點:

package com.xinguo.pm.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Savepoint;

public class TransactionTest {
    public static void main(String[] args) throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db","root","root");

        //開啟事務
        conn.setAutoCommit(false);
        PreparedStatement ps = null;
        Savepoint st = null;
        try {
            String sql1 = "insert into user(name.password) values(?,?)";
            ps = conn.prepareStatement(sql1);
            ps.setString(1, "jack");
            ps.setString(2,"123456");

            ps.executeUpdate();

            st = conn.setSavepoint();//設置一個保留點

            String sql2 = "insert into user(name.password) values(?,?)";
            ps = conn.prepareStatement(sql2);
            ps.setString(1, "rose");
            ps.setString(2,"234567");

            ps.executeUpdate();

            conn.rollback(st);//回滾到保留點
            conn.commit();//提交事務
        } catch (Exception e) {

        }

    }
}

事務的四個特征:

  1. 原子性(atomic) 組成事務的處理語句組成一個邏輯單元,這是最小的執行單元
  2. 一致性(consistent) 在事務處理執行之前和之后,數據是一致的
  3. 隔離性(isolated) 一個事務的處理對另一個事務沒有影響
  4. 持續性(durable)當事務處理成功后,其結果在數據庫中被永久的記錄下來

2.索引

索引是優化數據庫查詢速度的重要途徑。
但是會降低更新表的速度,比如對表的insert、update、delete操作,因為更新表
時,MySQL不僅僅要保存數據,還要保存索引文件。
並且建立索引會占用磁盤空間。如果在一個大表上創建了多種索引組合,索引文件會膨脹的很快。
創建索引

CREATE INDEX index1 ON user (name(20));

如果索引類型是varchar類型需要加上長度。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com