Java-学习日记(数据库与idea技巧)
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();
}
}
我曾七次鄙视自己的灵魂:
第一次,当它本可进取时,却故作谦卑;
第二次,当它在空虚时,用爱欲来填充;
第三次,在困难和容易之间,它选择了容易;
第四次,它犯了错,却借由别人也会犯错来宽慰自己;
第五次,它自由软弱,却把它认为是生命的坚韧;
第六次,当它鄙夷一张丑恶的嘴脸时,却不知那正是自己面具中的一副;
第七次,它侧身于生活的污泥中,虽不甘心,却又畏首畏尾。