精华内容
下载资源
问答
  • TP6 with 中添加条件
    千次阅读
    2020-06-11 13:37:58
    $config = self::where('status',1)
    		->field('id,title')
    		->with(['image','cate'=> function($query){
    			$query->where('status',1)
    			->order(['sorting'=>'asc','id'=>'asc'])
    			->field('id,title,cate_id')
    			->hidden(['cate_id']);
    }])->hidden(['image_id'])->order(['sorting'=>'asc','id'=>'asc'])->select();
    

    $query中关联键必不可少,可通过hidden进行隐藏。

    更多相关内容
  • 一、jdk8与之前的日期和时间处理类的不同: 1. Java的java.util.Date和java.util.Calendar类易用性差,不支持时区,并且是可变的,也就意味着他们都不是线程安全的; 2. 用于格式化日期的类DateFormat被放在java....

    目录

    前言

    一、jdk8与jdk7以及之前的日期和时间处理类的不同:

    二、Java 8日期/时间类

    三:日期和时间主要类的关系(待更新)

    四:日期操作和处理

    获取当前日期(只能精确到年月日)

    获取当前时间(可以精确到毫秒)

    获取上周周一的日期

    获取具体年、月、日、小时、分钟、秒

    指定日期、时间

    判断两个日期是否相等

    计算几年后(前)、几月后(前)、几天后(前)等的日期

    判断指定月份有多少天

    计算两个日期之间相差月数、天数、分钟数


    前言

    在很久之前,我总结了一些jdk7版本之前的关于时间处理的一些公共方法,日期转换成字符串、指定时间加上指定天数后的日期、获取上周周一时间 等等;具体的可以戳链接查看完整的:https://blog.csdn.net/qq_27471405/article/details/79523556

    但是这些是非线程安全的,不建议采用,举个例子

    在一个类中,有以下代码:
    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    public String getDate(Date date){
    return sdf.format(date);
    }

    上面这串代码在并发的时候,是线程不安全的,具体的如何不安全,大家可以搜一下,这里不多讲了

    那么今天给大家分享的是jdk8之后的一些时间处理的公共方法,是线程安全的,理应大家以后应该用下面这些方法

     

    一、jdk8与jdk7以及之前的日期和时间处理类的不同:


    1. Java的java.util.Date和java.util.Calendar类易用性差,不支持时区,并且是可变的,也就意味着他们都不是线程安全的;
    2. 用于格式化日期的类DateFormat被放在java.text包中,它是一个抽象类,所以我们需要实例化一个SimpleDateFormat对象来处理日期格式化,并且DateFormat也是非线程安全,这意味着如果你在多线程程序中调用同一个DateFormat对象,会得到意想不到的结果。
    3. 对日期的计算方式繁琐,而且容易出错,因为月份是从0开始的,这意味着从Calendar中获取的月份需要加一才能表示当前月份
    由于以上这些问题,出现了一些三方的日期处理框架,例如Joda-Time,data4j等开源项目


    二、Java 8日期/时间类


    Java 8的日期和时间类包含LocalDate、LocalTime、Instant、Duration以及Period,这些类都包含在java.time包中。

    • Instant:瞬时实例。

    • LocalDate:本地日期,不包含具体时间 例如:2014-01-14 可以用来记录生日、纪念日、加盟日等。

    • LocalTime:本地时间,不包含日期。

    • LocalDateTime:组合了日期和时间,但不包含时差和时区信息。

    • ZonedDateTime:最完整的日期时间,包含时区和相对UTC或格林威治的时差。

    新API还引入了 ZoneOffSet 和 ZoneId 类,使得解决时区问题更为简便。解析、格式化时间的 DateTimeFormatter 类也全部重新设计。

     

    三:日期和时间主要类的关系(待更新)

     

    1 、LocalDate的关系图:

    2、 LocalTime:

    3 、LocalDateTime:

    4 、OffsetTime:

    5 、OffsetDateTime:

    6、 ZonedDateTime:

    7 、Instant:

     

    四:日期操作和处理

     

    获取当前日期(只能精确到年月日)

    /**
         * 获取当前日期(只能精确到年月日)
         * @param formatStr
         */
        public static void getNowDate(String formatStr){
            if (StringUtils.isBlank(formatStr)){
                formatStr = "yyyy-MM-dd";
            }
            LocalDate now = LocalDate.now();
            System.out.println("当前日期: " + now + " " + now.getDayOfWeek());
            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(formatStr);                        // * 原文章链接:https://blog.csdn.net/qq_27471405/article/details/106824023   * 其他均为盗版,公众号:灵儿的笔记(zygxsq)
            String nowFormat = now.format(dateTimeFormatter);
            System.out.println("格式化后的当前日期:"+nowFormat);
        }

    如果传格式化到天小时秒的话,会报异常:Exception in thread "main" java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: HourOfDay

     

    获取当前时间(可以精确到毫秒)

     /**
         * 获取当前时间(可以精确到毫秒)
         * 原文章链接:https://blog.csdn.net/qq_27471405/article/details/106824023
         * 其他均为盗版,公众号:灵儿的笔记(zygxsq)
         * @param formatStr
         */
        public static void getNowTime(String formatStr){
            if (StringUtils.isBlank(formatStr)){
                formatStr = "yyyy-MM-dd";
            }
            LocalDateTime now = LocalDateTime.now();
            System.out.println("当前日期: " + now + " " + now.getDayOfWeek());
            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(formatStr);                      // * 原文章链接:https://blog.csdn.net/qq_27471405/article/details/106824023    * 其他均为盗版,公众号:灵儿的笔记(zygxsq)
    
            String nowFormat = now.format(dateTimeFormatter);
            System.out.println("格式化后的当前日期:"+nowFormat);
    
        }

     

    获取上周周一的日期

    /**
         * 获取上周周一的日期
         * 原文章链接:https://blog.csdn.net/qq_27471405/article/details/106824023
         * 其他均为盗版,公众号:灵儿的笔记(zygxsq)
         */
        public static void getLastMonday(){
            LocalDate now = LocalDate.now();
            System.out.println("当前日期: " + now + " " + now.getDayOfWeek());
            LocalDate todayOfLastWeek = now.minusDays(7);
            LocalDate last_monday = todayOfLastWeek.with(TemporalAdjusters.previous(DayOfWeek.SUNDAY)).plusDays(1); // * 原文章链接:https://blog.csdn.net/qq_27471405/article/details/106824023   * 其他均为盗版,公众号:灵儿的笔记(zygxsq)
            System.out.println("上周周一日期:"+last_monday); 
        }

     

    获取具体年、月、日、小时、分钟、秒

    /**
         * 获取具体年、月、日、小时、分钟、秒
         * @param formatStr
         */
        public static void getDetailTime(String formatStr){
            LocalDateTime now = LocalDateTime.now();
            System.out.println("当前日期: " + now + " " + now.getDayOfWeek());
            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(formatStr);
    
            String nowFormat = now.format(dateTimeFormatter);
            System.out.println("格式化后的当前日期:"+nowFormat);
    
            int year = now.getYear();
            int month = now.getMonthValue();
            int day = now.getDayOfMonth();
            int hour = now.getHour();
            int minute = now.getMinute();
            int second = now.getSecond();
            int nano = now.getNano();
            
            System.out.printf("年 : %d  月 : %d  日 : %d  小时:%d 分钟:%d 秒:%d  毫秒:%d %n", year, month, day,hour,minute,second,nano);  // * 原文章链接:https://blog.csdn.net/qq_27471405/article/details/106824023   * 其他均为盗版,公众号:灵儿的笔记(zygxsq)
        }

     

    指定日期、时间

    /**
         * 指定日期、时间
         * 原文章链接:https://blog.csdn.net/qq_27471405/article/details/106824023
         * 其他均为盗版,公众号:灵儿的笔记(zygxsq)
         * @param formatStr
         */
        public static void createTime(String formatStr){
            LocalDate date = LocalDate.of(2020, 04, 27);
            System.out.println("指定日期: " + date);
            LocalDateTime time = LocalDateTime.of(2020, 04, 27,06,10,50);
            System.out.println("指定时间: " + time);
    
            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(formatStr);
            String nowFormat = time.format(dateTimeFormatter);
            System.out.println("格式化后的指定时间:"+nowFormat);
        }

     

    判断两个日期是否相等

    /**
         * 判断两个日期是否相等、之前、之后
         * 原文章链接:https://blog.csdn.net/qq_27471405/article/details/106824023
         * 其他均为盗版,公众号:灵儿的笔记(zygxsq)
         */
        public static void compareDate(){
            LocalDate now = LocalDate.now();
            System.out.println("当前时间: " + now + " " + now.getDayOfWeek());
            LocalDate date1 = LocalDate.of(2020, 04, 27);
            LocalDate date2 = LocalDate.of(2020, 04, 27);
            LocalDate date3 = LocalDate.of(2020, 04, 28);
    
            boolean equal = now.isEqual(date1);
            System.out.printf("是否是同一时间:%s ", date1.equals(now));
            System.out.printf("是否是同一时间:%s ", now.isEqual(date1));
    
            System.out.println();
            System.out.printf("是否是同一时间:%s ", date1.equals(date2));
            System.out.printf("是否是同一时间:%s ", date1.isEqual(date2));
            System.out.println();
            System.out.println("data2(2020.4.27)是否比data3(2020.4.28)小: "+date2.isBefore(date3));             * 原文章链接:https://blog.csdn.net/qq_27471405/article/details/106824023   * 其他均为盗版,公众号:灵儿的笔记(zygxsq)
            System.out.println("data2(2020.4.27)是否比data3(2020.4.28)大: "+date2.isAfter(date3));
        }

     

    计算几年后(前)、几月后(前)、几天后(前)等的日期

    /**
         * 计算几年后(前)、几月后(前)、几天后(前)等的日期
         * 原文章链接:https://blog.csdn.net/qq_27471405/article/details/106824023
         * 其他均为盗版,公众号:灵儿的笔记(zygxsq)
         * @param formatStr
         */
        public static void calculateTime(String formatStr){
            LocalDateTime now = LocalDateTime.now();
            LocalDateTime newTime = now.plusHours(6);
    
            System.out.println("当前时间: " + now + " " + now.getDayOfWeek());
            System.out.println("6小时后的时间: " +  newTime);
            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(formatStr);
            String nowFormat = now.format(dateTimeFormatter);
            String newFormat = newTime.format(dateTimeFormatter);
            System.out.println("格式化后的当前时间:"+nowFormat);
            System.out.println("格式化后的6小时后的时间:"+newFormat);
    
            LocalDateTime twoYearsLater = now.plusYears(2);
            String twoYearsFormat = twoYearsLater.format(dateTimeFormatter);
            System.out.println("2年后的时间:"+twoYearsFormat);
    
            LocalDateTime twoMonthsLater = now.plusMonths(2);
            String twoMonthsFormat = twoMonthsLater.format(dateTimeFormatter);
            System.out.println("2个月后的时间:"+twoMonthsFormat);
    
            LocalDateTime twoWeeksLater = now.plusWeeks(2);
            String twoWeeksFormat = twoWeeksLater.format(dateTimeFormatter);
            System.out.println("2周后的时间:"+twoWeeksFormat);
    
            LocalDateTime twoDaysLater = now.plusDays(2);
            String twoDaysFormat = twoDaysLater.format(dateTimeFormatter);
            System.out.println("2天后的时间:"+twoDaysFormat);
    
            LocalDateTime twoMinutesLater = now.plusMinutes(2);
            String twoMinutesFormat = twoMinutesLater.format(dateTimeFormatter);
            System.out.println("2分钟后的时间:"+twoMinutesFormat);
    
            LocalDateTime twoMinutesBefore = now.plusMinutes(-2);
            String twoMinutesBeforeFormat = twoMinutesBefore.format(dateTimeFormatter);
            System.out.println("2分钟前的时间:"+twoMinutesBeforeFormat);
    
            //原文章链接:https://blog.csdn.net/qq_27471405/article/details/106824023
            //其他均为盗版,公众号:灵儿的笔记(zygxsq)
            //还可以直接通过plus方法计算 几年(月周天)后
            LocalDateTime twoYearsPlusLater = now.plus(2, ChronoUnit.YEARS);
            String twoYearsPlusLaterFormat = twoYearsPlusLater.format(dateTimeFormatter);
            System.out.println("2年后的时间:"+twoYearsPlusLaterFormat);
    
            //负号表示 之前
            LocalDateTime twoDaysPlusBefore = now.plus(-2, ChronoUnit.DAYS);
            String twoDaysPlusBeforeFormat = twoDaysPlusBefore.format(dateTimeFormatter);
            System.out.println("2天前的时间:"+twoDaysPlusBeforeFormat);
            //也可以用minus,也表示之前
            LocalDateTime twoDaysMinusBefore = now.minus(2, ChronoUnit.DAYS);
            String twoDaysMinusBeforeFormat = twoDaysMinusBefore.format(dateTimeFormatter);
            System.out.println("2天前的时间:"+twoDaysMinusBeforeFormat);
        }

     

    判断指定月份有多少天

     /**
         * 判断指定月份有多少天
         */
        public static void getMonthDays(){
            YearMonth currentYearMonth = YearMonth.now();
            System.out.println("当前时间:"+currentYearMonth);
            System.out.println("当前月份有多少天:"+currentYearMonth.lengthOfMonth());
    
            YearMonth february = YearMonth.of(2020, Month.FEBRUARY);
            System.out.println("指定时间的月份2月:"+february);
            System.out.println("指定时间的月份2月有多少天:"+february.lengthOfMonth());
            
        }

     

    计算两个日期之间相差月数、天数、分钟数

    /**
         * 计算两个日期之间相差月数、天数、分钟数
         * 原文章链接:https://blog.csdn.net/qq_27471405/article/details/106824023
         * 其他均为盗版,公众号:灵儿的笔记(zygxsq)
         */
        public static void getDaysBetweenTwoDate(){
            LocalDate startDate = LocalDate.of(2020, 04, 27);
            LocalDate endDate = LocalDate.of(2020, 07, 2);
    
            long months = startDate.until(endDate, ChronoUnit.MONTHS);
            long days = startDate.until(endDate, ChronoUnit.DAYS);
            System.out.println("startDate(2020.04.27)和endDate(2020.07.02)相差月数:"+months);
            System.out.println("startDate(2020.04.27)和endDate(2020.07.02)相差天数:"+days);
    
            LocalDateTime startTime = LocalDateTime.of(2020, 04, 27,18,20,10);
            LocalDateTime endTime = LocalDateTime.of(2020, 04, 27,18,30,12);
            long minutes = startTime.until(endTime, ChronoUnit.MINUTES);
            System.out.println("startTime(2020.04.27 18:20:10)和endTime(2020.04.27 18:30:20)相差分钟数:"+minutes); // * 原文章链接https://blog.csdn.net/qq_27471405/article/details/106824023 * 其他均为盗版,公众号:灵儿的笔记(zygxsq)
    
        }

     

     


    参考文章 

    https://blog.csdn.net/u012091080/article/details/79901830

    https://blog.csdn.net/chenleixing/article/details/44408875

    https://blog.csdn.net/feicongcong/article/details/78224494

    感谢原作者的分享,让技术人能够更快的解决问题 

    我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=lnlh8qa6e7an

    展开全文
  • 时间字段索引

    千次阅读 2020-03-24 18:29:58
    文章目录为时间字段索引(待更进)一、问题1、描述:日期不一致2、原因:时区不同3、解决方法: 时区修改二、datetime和varchar类型效率比较1、背景2、开始三、时间字段索引1、聚集索引2、非聚集索引3、时间字段...

    为时间字段加索引(待更进)

    一、问题

    1、描述:日期不一致
    • 在centos7中运行docker,docker中运行mysql,在IDEA中将日期数据写入dates表中

    • dates表
      在这里插入图片描述

    • 插入日期数据

    @Test
    void contextLoads() {
      Date date = new Date(System.currentTimeMillis());
      System.out.println(date);   //Tue Mar 24 13:08:49 CST 2020
      questionMapper.insertdateTime(date);
    }
    
    • mysql中dates数据

    在这里插入图片描述

    2、原因:时区不同

    ​ 发现后台输入和数据库中的数据相差了8个小时,因为系统时区和docker中的mysql时区相差8个时区

    [root@localhost ~]# docker exec -it mysql01 /bin/bash
    root@1c202aea2496:/# mysql -uroot -p  
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 2604
    Server version: 5.7.29 MySQL Community Server (GPL)
    
    Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql> show variables like '%time_zone%';
    +------------------+--------+
    | Variable_name    | Value  |
    +------------------+--------+
    | system_time_zone | UTC    |
    | time_zone        | SYSTEM |
    +------------------+--------+
    2 rows in set (0.01 sec)
    

    备注:

    • 在连接mysql时记得有"-u"参数,否则会出现Ignoring query to other database错误
    3、解决方法: 时区修改
    mysql> set global time_zone = '+8:00';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> show variables like '%time_zone%';
    +------------------+--------+
    | Variable_name    | Value  |
    +------------------+--------+
    | system_time_zone | UTC    |
    | time_zone        | SYSTEM |
    +------------------+--------+
    2 rows in set (0.02 sec)
    
    • 再次插入日期数据
    Tue Mar 24 13:32:39 CST 2020
    
    • 数据查看
      在这里插入图片描述

    二、datetime和varchar类型效率比较

    ​ 我记得之前我是通过修改了my.conf文件,进而修改了docker中mysql的日期格式,起效果后,但是下次重启mysql时,启动不容器。打开错误日志后,告诉我my.conf里出现错误,我迫不得已将日期格式改了回来,将datetime改成了varchar类型,来存储时间。

    ​ 至于如何让docker中的mysql重启的,详见这里

    ​ 那么datetime和varchar在查找和内存消耗方面有什么区别吗?

    以下测试摘录于这里

    1、背景

    大家都知道数据库表字段设计得是否合理,对查询速度的快慢至关重要,下面做个简单的测试,看下差距有多大

    2、开始

    1、在数据库中新建两个表 test1(不合理的表)test2(合理表),两张表的 send_time 字段的类型不一样

    CREATE TABLE `test1` (
    	 `id` int(11) NOT NULL AUTO_INCREMENT,
    	`send_time` varchar(20) DEFAULT NULL,
    	PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    
    CREATE TABLE `test2` (
    	 `id` int(11) NOT NULL AUTO_INCREMENT,
    	`send_time` datetime DEFAULT NULL,
    	PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    
    

    2、新建存储过程,导入10 000 000 条测试数据(运行过程可能需要几分钟),运行结束后再将数据导入表test2保证两张表的数据一致

    BEGIN
    DECLARE i INT DEFAULT 0;
    START TRANSACTION;
    	WHILE i<10000000 DO
    INSERT INTO test1(send_time) VALUES(from_unixtime(1541302365+FLOOR(rand()*154130236),"%Y-%m-%d %H:%i:%s"));
    SET i=i+1;
    END WHILE;
    COMMIT;
    END
    
    

    3、查看表信息可得:
    在这里插入图片描述
    在这里插入图片描述

    结论:varchar 表字段占用存储空间 是 datetime 表的三倍左右
    

    4、查询速度比较

    	SELECT * FROM test1 WHERE send_time>'2019-03-17' and send_time<'2019-03-18';
    	SELECT * FROM test2 WHERE send_time>'2019-03-17' and send_time<'2019-03-18';
    	
    	结果比较
    	test1			test2
    	2.653s			1.833s
    	2.650s			1.866s
    
    

    5、给表添加索引(执行过程需要几分钟),并查询速度比较

    	-- 添加索引		
    	ALTER TABLE `test1` ADD INDEX `n_sendtime` (`send_time`) ;
    	ALTER TABLE `test2` ADD INDEX `n_sendtime` (`send_time`) ;
    
    	-- 查询速度比较:
    	SELECT * FROM test1 WHERE send_time>'2019-03-17' and send_time<'2019-03-18';
    	SELECT * FROM test2 WHERE send_time>'2019-03-17' and send_time<'2019-03-18';
    	
    	结果比较
    	test1			test2
    	0.084s			0.048s
    	0.062s			0.046s
    	0.062s			0.048s
    	0.066s			0.047s
    
    

    4、结论

    • 合理的字段类型不论对 查询速度 或是 数据存储 都至关重要
    • 时间字段用dateTime等时间类型,不要用varchar类型

    三、时间字段加索引

    1、聚集索引
    • 表记录的排列顺序和与索引排列顺序一致

    • 一个表中只能拥有一个聚集索引

    • 修改慢。为了保证表中记录的物理和索引顺序一致,在记录插入的时候,会对数据页重新排序

    • 聚集索引的叶节点就是最终的数据节点

    2、非聚集索引
    • 逻辑顺序与磁盘上行的物理存储顺序不同
    • 一个表中可以拥有多个非聚集索引
    • 非聚集索引的叶节仍然是索引节点,但它有一个指向最终数据的指针
    动作描述使用聚集索引使用非聚集索引
    列经常被分组排序
    返回某范围内的数据不应
    一个或极少不同值不应不应
    小数目的不同值不应
    大数目的不同值不应
    频繁更新的列不应
    外键列
    主键列
    频繁修改索引列不应
    3、时间字段是否适合加索引

    以下摘自此处

    • 可以建立索引的;至于建立聚集索引或者是非聚集索引,那要看你这个时间字段的具体情况以及使用或变更频繁程度。

    • 一般来说,适合建立聚集索引的要求:“既不能绝大多数都相同,又不能只有极少数相同”的规则。

    • 先说说一个误区:有人认为:只要建立索引就能显著提高查询速度。这个想法是很错误的。建立非聚集索引,确实,一般情况下可以提高速度,但是一般并不会达到你想要的速度。只有在适当的列建立适当的(聚集)索引,才能达到满意的效果

    • 考虑表空间和磁盘空间是否足够。我们知道索引也是一种数据,在建立索引的时候势必也会占用大量表空间。因此在对一大表建立索引的时候首先应当考虑的是空间容量问题。

    聚集索引和非聚集索引根本区别以及使用方式

    ​ 这就得看看项目中对该时间字段的具体操作了。

    ---- 待更新

    四、参考文档

    1、聚集索引和非聚集索引根本区别以及使用方式

    2、mysql索引的应用

    3、聚集索引和非聚集索引 简析与对比

    4、索引深入浅出(3/10):聚集索引的B树结构

    展开全文
  • with(nolock)的用法

    万次阅读 2018-04-19 10:50:58
    其实除了index的建立之外,当我们在下SQL Command时,在语法中加一段WITH (NOLOCK)可以改善在线大量查询的环境中数据集被LOCK的现象藉此改善查询的效能。不过有一点千万要注意的就是,WITH (NOLOCK)的SQL SELECT有...


    本文导读:要提升SQL的查询效能,一般来说大家会以建立索引(index)为第一考虑。其实除了index的建立之外,当我们在下SQL Command时,在语法中加一段WITH (NOLOCK)可以改善在线大量查询的环境中数据集被LOCK的现象藉此改善查询的效能。不过有一点千万要注意的就是,WITH (NOLOCK)的SQL SELECT有可能会造成Dirty Read。

    with(nolock)的介绍

     

    大家在写查询时,为了性能,往往会在表后面加一个nolock,或者是with(nolock),其目的就是查询是不锁定表,从而达到提高查询速度的目的。

     

    当同一时间有多个用户访问同一资源,并发用户中如果有用户对资源做了修改,此时就会对其它用户产生某些不利的影响,例如:

     

    1、脏读

    一个用户对一个资源做了修改,此时另外一个用户正好读取了这条被修改的记录,然后,第一个用户放弃修改,数据回到修改之前,这两个不同的结果就是脏读。

    2、不可重复读

    一个用户的一个操作是一个事务,这个事务分两次读取同一条记录,如果第一次读取后,有另外用户修改了这个数据,然后第二次读取的数据正好是其它用户修改的数据,这样造成两次读取的记录不同,如果事务中锁定这条记录就可以避免。

    3、幻读

    指用户读取一批记录的情况,用户两次查询同一条件的一批记录,第一次查询后,有其它用户对这批数据做了修改,方法可能是修改,删除,新增,第二次查询时,会发现第一次查询的记录条目有的不在第二次查询结果中,或者是第二次查询的条目不在第一次查询的内容中。

     

    NOLOCK 语句执行时不发出共享锁,允许脏读 ,等于 READ UNCOMMITTED事务隔离级别 。nolock确实在查询时能提高速度,但它并不是没有缺点的,起码它会引起脏读、只适用与select查询语句。 在一些不需要考虑脏读的场合会用到,例如当用户在论坛发广告贴时删除其所有发帖,这个查询就不怕脏读,全删,或者漏一个正在发的都不是问题。

     

    二、实例

     
    SQL 代码    复制
    SELECT  COUNT(UserID)   
    
    FROM    EMPLOYEE WITH (NOLOCK)           
    
    JOIN WORKING_GROUP WITH (NOLOCK)           
    
    ON EMPLOYEE.UserID = WORKING_GROUP.UserID  
    

     

    三、with(nolock)的使用场景

     

    1:数据量特别大的表,牺牲数据安全性来提升性能是可以考虑的;

    2:允许出现脏读现象的业务逻辑,反之一些数据完整性要求比较严格的场景就不合适了,像金融方面等。

    3:数据不经常修改的表,这样会省于锁定表的时间来大大加快查询速度。

    4、当使用NoLock时,它允许阅读那些已经修改但是还没有交易完成的数据。因此如果有需要考虑transaction事务数据的实时完整性时,使用WITH (NOLOCK)就要好好考虑一下。
     

     

    四、nolock和with(nolock)的几个小区别

     

    1、SQL05中的同义词,只支持with(nolock);

    2、with(nolock)的写法非常容易再指定索引。

    3、跨服务器查询语句时 不能用with (nolock) 只能用nolock,同一个服务器查询时 则with(nolock)和nolock都可以用

    展开全文
  • 七段S型减速算法–时间同步 基本概念 7段S型减速算法(7 segments S-curve velocity profile),是由T型速度曲线(Trapezoidal motion profile)演化而来(此外,还有多项式规划(Polynomial Profile),如三次...
  • 时间窗和同时取送货的车辆路径问题(VehicleRouting Problem with Simultaneous Piekup and Delivery and Time Windows,VRPSPDTW)是指一组具有相同类型的车辆从配送中心出发,对其确定的客户集进行服务,完成服务后...
  • 小程序日期加时间选择器

    千次阅读 2019-01-16 17:43:20
    我是先在util.js里面写入方法,然后在要...function withData(param) { return param &lt; 10 ? '0' + param : '' + param; } function getLoopArray(start, end) { var start = start || 0; var end = end ...
  • 读写文件背景读写文件是最常见的IO操作。Python内置了读写文件的函数,用法和C是兼容的。在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序...open()、with open()打开文件要以读文件的...
  • (2)日期一天操作; (3)输出函数,输出格式为“XXXX-XX-XX”; (4)编写主函数,定义对象,完成相应功能。 程序的参考的输入(“Input Date:”为提示文字): Input Date:2016 2 28 程序的输出: 2016-2-28 ...
  • python读取文件之with open()

    千次阅读 2019-11-28 13:59:12
    open()完成后必须调用close()方法关闭文件,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的,由于文件读写时都有可能产生IOError,一旦出错,后面的f....
  • group by with cube

    千次阅读 2020-01-17 10:19:13
    CUBE运算符生成的结果集是多维数据集,多维数据集是事实数据的扩展,事实数据即记录个别时间的数据,扩展建立在用户准备分析的列上,这些列被称为维,多维数据集是一个结果集,其中包含各纬度所有可能的交叉表格. ...
  • 最近在维护公司一个框架的时候发现,新添加的cpp代码编译后有的会报这样的错误,因此花了一点时间深入分析了一下这个问题的根本原因: 这两个问题的根本原因是由于cpp文件和c文件分别被gcc(使用gcc编译c和cpp文件...
  • 视图后面加with(nolock)后

    千次阅读 2013-01-25 10:33:33
    为此决定对报表相关查询表进行无锁操作,即在表后面 with(nolock),但我们为客户端是以视图形式提供,为此产生一个问题:在视图后面加with(nolock),是否意味着视图内的所有表都是nolock?    我在网上没找到...
  • HTTP之X-Requested-With分析和思考

    万次阅读 2016-01-22 17:05:06
    本文主要是针对自己在实际的协议分析过程中遇到的X-Requested-With头域进行了分析,主要分析了该头域为什么会出现,以及在什么情况下出现。好像是同一个问题,但是细究还是有所不同。  最近在报文抓包的时候遇到了...
  • 1.日期和时间间字段 date:日期字段,格式:2016-04-15 timestamp:时间字段,格式:2016-04-15 20:00:00 2.获取当时时间函数 select now(); select current_timestamp; select CURRENT_TIME; select LOCALTIME; ...
  • 准备开发一个flutter的项目,在环境搭建完成,新建后第一次执行时,问题来了,这里做个记录分享解决...Finished with error: ProcessException: Process "F:\zy\httpd\flutter_app\android\gradlew.bat" exited abno...
  • date时间加减(linux,aix)

    千次阅读 2017-07-04 11:11:39
    需求是这样的,有一个在日志中的时间,格式化为%Y%m%d-%H%M%S格式的,那现在想比较这个时间与当前时间差值是否大于一天,这个应该怎么做呢?设计到日期的减法运算,首先先man date来看一下用法吧。 DATE(1) User ...
  • ... 纸上得来终觉浅,绝知此事要躬行   博客园 首页 新闻 新随笔 联系 ...ORACLE WITH AS 用法 ...With查询语句不是以select开始的,而是以“WITH”关键字开头  可认为在真正进行查询之前预...
  • 这是一方面,但后来发现忘了用with torch.no_grad(): 这导致模型运算的时候不能释放显存(记录了梯度信息),所以显存巨大。 了之后,不过3G显存就够了。。确实inference不需要那么多显存的,以后记着这种不正常...
  • 【阅读笔记】ImageNet Classification with Deep Convolutional Neural Networks
  • 由于 git rebase 命令的存在,强制将提交推送到远端仓库...本文将推荐 --force-with-lease 参数,让我们可以更安全地进行强制推送。 --force-with-lease 参数自 Git 的 1.8.5 版本开始提供,只在解决 git push --...
  • 介绍 PostgreSQL 获取当前日期时间的函数及注意事项:包括 CURRENT_DATE、CURRENT_TIME、LOCALTIME、CURRENT_TIMESTAMP、LOCALTIMESTAMP、transaction_timestamp()、statement_timestamp()、clock_timestamp()、time...
  • with open(full_path, 'a', newline='') as f: writer = csv.writer(f) writer.writerow([newTime, '1'])
  • 时间:2012 出版源:Neural Information Processing Systems (NIPS) 论文领域:深度学习,计算机视觉 引用格式:Krizhevsky A, Sutskever I, Hinton G E. Imagenet classification with deep convolutional neural ...
  • DB2 with的定义与用法

    万次阅读 多人点赞 2016-03-25 11:01:04
    With定义与用法 -------部分内容为转载并经整理处理--------------------- 1.with理解与基本用法 说起WITH 语句,除了那些第一次听说WITH语句的人,大部分人都觉得它是用来做递归查询的。其实那只是...
  • 源论文+源代码:Search for Dense Deep Unfolding Network with 3D-CNN Prior for Snapshot Compressive Imaging | Papers With Codehttps://paperswithcode.com/search?q_meta=&q_type=&q=Dense+Deep+...
  • 【笔记】把时间加到文件名中

    千次阅读 2017-11-18 11:16:51
    时间加到文件名中注: 在linux环境中测试。代码:把时间加到文件名中#include #include <stdio.h>int main() { time_t t = time(0); struct tm *tmp = localtime(&t); char time_str[64] = {0}; strftime...
  •  a 检查 dao层 service层 controller层有没有注解 如果没有加上一般就Ok了 如果了 请看b步骤  b 检查 添加了注解dao层service层controller层对应的包有没有添加进针对这些注解的包扫描中 如果没有 加上就...
  • Self-training with Noisy Student

    千次阅读 2019-11-16 17:04:24
    目录Self-training with Noisy Student improves ImageNet classification1、数据集简介2、性能3、模型策略4、实验策略5、Other Self-training with Noisy Student improves ImageNet classification 该篇论文作者之...
  • linux系统启动报错:[contains a file system with errors, check forced]的解决方法参考 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 421,285
精华内容 168,514
关键字:

with加时间