Java雜記-2020.07.28
簡單記錄下今天專案用到的東西還有技術公眾號學到的一些知識點
- Java事務
- idea編碼技巧
- 資料庫快速插入100萬條資料
- 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();
}
}