java 批量插入clob_Java-每日学习笔记(数据库与idea技巧)

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) :避免以上所有读问题.

b96c38d3e48972eb5bda9c724bb52316.png

idea编码技巧

idea中关于快速生成try,catch,for,while等语句:https://mp.weixin.qq.com/s/dKcduFBcNwWfXwpbSkTA

数据库快速插入100万条数据

主要是建立存储过程就能实现 下面会很慢的原因是插入语句耗时长,可以批量删除进一步优化,具体可以见下面博客 https://www.jianshu.com/p/36b87cb3a05a

  1. CREATE TABLE `logs` (
  2. `id` INT(11) NOT NULL AUTO_INCREMENT,
  3. `logtype` VARCHAR(255) DEFAULT NULL,
  4. `logurl` VARCHAR(255) DEFAULT NULL,
  5. `logip` VARCHAR(255) DEFAULT NULL,
  6. `logdz` VARCHAR(255) DEFAULT NULL,
  7. `ladduser` VARCHAR(255) DEFAULT NULL,
  8. `lfadduser` VARCHAR(255) DEFAULT NULL,
  9. `laddtime` DATETIME DEFAULT NULL,
  10. `htmlname` VARCHAR(255) DEFAULT NULL,
  11. PRIMARY KEY (`id`)
  12. ) ENGINE=MYISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='日志表';
  1. DROP PROCEDURE IF EXISTS my_insert;
  2. DELIMITER //
  3. CREATE PROCEDURE my_insert()
  4. BEGIN
  5. DECLARE n INT DEFAULT 1;
  6. loopname:LOOP
  7. 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', '首页');
  8. SET n=n+1;
  9. IF n=10000000 THEN
  10. LEAVE loopname;
  11. END IF;
  12. END LOOP loopname;
  13. END;
  14. //
  15. DELIMITER ;
  1. CALL my_insert();

Java中sql语句的回滚

使用的是spring中的@Transactional(rollbackFor=Exception.class)来实现,下面就能成功实现如果后面语句出错,就成功回滚

  1. @Test
  2. @Transactional(rollbackFor=Exception.class)
  3. public void testApplyAdjustUpdate(){
  4. try{
  5. //这里就可以写mapper的语句
  6. mapper.update();
  7. //设置空指针异常来检查是否成功rollback
  8. Integer a = null;
  9. int b = a;
  10. } catch(Exception e){
  11. e.printStackTrace();
  12. TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  13. }
  14. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值