zoukankan      html  css  js  c++  java
  • 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) :避免以上所有读问题.

    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();
            }
        }
    
  • 相关阅读:
    YYModel Summary
    Custom-->TableView_Swizzle
    创建UIBarButtonItem的分类
    为家庭版系统添加组策略
    JSDOM
    JavaScript
    python基础三元表达式和内置函数列表
    二.ubuntu14.04 3D特效设置
    一.ubuntu14.04安装、亮度设置、显卡设置等一体化讲解
    oracle12c及PLSQL Developer安装全程记录
  • 原文地址:https://www.cnblogs.com/meditation5201314/p/13394096.html
Copyright © 2011-2022 走看看