Java-每日學習筆記(資料庫與idea技巧)

Empirefree發表於2020-07-28

Java雜記-2020.07.28

簡單記錄下今天專案用到的東西還有技術公眾號學到的一些知識點

  1. Java事務
  2. idea編碼技巧
  3. 資料庫快速插入100萬條資料
  4. Java實現sql回滾

Java事務

事務(Transaction)的四個屬性(ACID)

  • 原子性(Atomic) 對資料的修改要麼全部執行,要麼全部不執行。
  • 一致性(Consistent) 在事務執行前後,資料狀態保持一致性。
  • 隔離性(Isolated) 一個事務的處理不能影響另一個事務的處理。
  • 持續性(Durable) 事務處理結束,其效果在資料庫中持久化。

Java事務的型別有三種:JDBC事務、JTA(Java Transaction API)事務、容器事務。

事務併發處理可能引起的問題

  • 髒讀(dirty read):一個事務讀取了另一個事務尚未提交的資料,
  • 不可重複讀(non-repeatable read) :一個事務的操作導致另一個事務前後兩次讀取到不同的資料
  • 幻讀(phantom read) :一個事務的操作導致另一個事務前後兩次查詢的結果資料量不同。

解決讀問題: 設定事務隔離級別(5種)
未提交讀(read uncommited) :髒讀,不可重複讀,虛讀都有可能發生
已提交讀 (read commited):避免髒讀。但是不可重複讀和虛讀有可能發生
可重複讀 (repeatable read) :避免髒讀和不可重複讀.但是虛讀有可能發生.
序列化的 (serializable) :避免以上所有讀問題.

idea編碼技巧

idea中關於快速生成try,catch,for,while等語句:https://mp.weixin.qq.com/s/dKcdu_FBcNwWfXwpbSkT_A

資料庫快速插入100萬條資料

主要是建立儲存過程就能實現
下面會很慢的原因是插入語句耗時長,可以批量刪除進一步優化,具體可以見下面部落格
https://www.jianshu.com/p/36b87cb3a05a


CREATE TABLE `logs` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `logtype` VARCHAR(255) DEFAULT NULL,
  `logurl` VARCHAR(255) DEFAULT NULL,
  `logip` VARCHAR(255) DEFAULT NULL,
  `logdz` VARCHAR(255) DEFAULT NULL,
  `ladduser` VARCHAR(255) DEFAULT NULL,
  `lfadduser` VARCHAR(255) DEFAULT NULL,
  `laddtime` DATETIME DEFAULT NULL,
  `htmlname` VARCHAR(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MYISAM  AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='日誌表';

DROP PROCEDURE IF EXISTS my_insert;
DELIMITER //
CREATE PROCEDURE my_insert()
BEGIN
   DECLARE n INT DEFAULT 1;
        loopname:LOOP
            INSERT INTO `logs`(`logtype`,`logurl`,`logip`,`logdz`,`ladduser` ,`lfadduser`,`laddtime`,`htmlname`) VALUES ( 2, '/index', '0:0:0:0:0:0:0:1', NULL, NULL, 'null', '2018-05-03 14:02:42', '首頁');
            SET n=n+1;
        IF n=10000000 THEN
            LEAVE loopname;
        END IF;
        END LOOP loopname;
END;
//
DELIMITER ;
CALL my_insert();

Java中sql語句的回滾

使用的是spring中的@Transactional(rollbackFor=Exception.class)來實現,下面就能成功實現如果後面語句出錯,就成功回滾

    @Test
    @Transactional(rollbackFor=Exception.class)
    public void testApplyAdjustUpdate(){
        try{
            //這裡就可以寫mapper的語句
            mapper.update();
            //設定空指標異常來檢查是否成功rollback
            Integer a = null;
            int b = a;
        } catch(Exception e){
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    }

相關文章