mysql事务

事务(mysql)

第一章 事务概念

1、事务机制在程序开发过程中有着很大的作用。在现实生活中,经常进行转账操作,分为两个步骤:转入与转出,只有当两部分都完成才认为转账成功。

2、如果其中任意操作异常没有执行成功,则会导致两账户的金额不同步,造成错误,为了避免上述错误,数据库引入事务。

3、事务:就是对数据库的一组操作,可以为一条或多条 sql 执行,其特点:要么都做,要么都不做。

在数据库中使用事务时,必须先开启事务,命令如下:

start transaction;

事务开启后就可以执行 sql 语句,sql 语句执行完成后,需要相应语句来提交事务,可使用如下命令来结束事务

#提交
commit;
#回滚
rollback;

sql 语句是自动提交的,事务需要手动提交:commit

如果不想提交事务,可通过 rollback 来回滚事务,使事务结束。

已提交的事务不能回滚

案例操作:

创建表:

create table account(
	id int primary key auto_increment,
    name varchar(40),
    money float
);
#插入数据
insert into account(name,money) values('a',100);
insert into account(name,money) values('b',100);

演示事务操作:

  • 首先开启事务

    • start transaction;
      
  • 转账

    • update account set money=money-10 where name='a';
      update account set money=money+10 where name='b';
      
  • 提交事务

    • commit;
      

通过 a 账户向 b 账户转入 10元,结果如下:

注意:当 update 中出现错误,会导致事务不执行,这样保证了事务的同步性。

而事务有严格的定义,必须满足 4 个特性:

  • 原子性(atomicity)
    • 指一个事务必须视为一个不可分割的最小工作单元,当事务中所有的操作完成后,才算整个事务执行成功,事务中有一条 sql 失败,则执行成功的 sql 也必须撤销,数据库的状态回退到执行事务前的状态
  • 一致性(consistency)
    • 指事物将数据库从一种状态转换为另一种状态;例如事务执行失败,数据库回退到执行事务前的状态。
  • 隔离性(isolation)
    • 也称并发控制、可串性化、锁等,指事务各自执行,互不干扰
  • 持久性(durability)
    • 事务操作一旦提交,其修改的数据就会永久保存在数据库中。

第二章 事务提交

事务操作最后需要手动提交,这个过程为确认过程。

例如在第一章 中 a账户向 b 账户转账了 10元,现在反过来

start transaction;
update account set money=money+10 where name='a';
update account set money=money-10 where name='b';

执行上述命令,后查看数据

上述事务没有提交|回滚操作,这样会导致数据只是临时修改,当重新登录数据库后,数据库中没有改变,如下:

发现数据没有修改,因为事务需要手动提交,下面为手动提交后的结果:(重新登录数据库)

start transaction;
update account set money=money+10 where name='a';
update account set money=money-10 where name='b';
commit;

所以事务一定需要提交,否则事务操作是暂时的。

第三章 事务回滚

在操作事务时,发现当前事务中的操作不合理,此时只要事务还没有提交,就可以通过 回滚 来取下事务.

案例操作:a账户向 b 账户转账 10元

start transaction;
update account set money=money-10 where name='a';
update account set money=money+10 where name='b';

上述命令没有提交命令,也就是事务没有提交

执行结果如下:

可以看出转账操作成功执行,但此时 a 不想转账了,这时由于事务还没提交,所以可以撤销上述操作,通过如下命令:

rollback;

上述命令执行后结果如下所示:

可发现转账操作撤销了。

第四章 事务隔离级别

数据库是多线程并发访问的,所以很容易出现多个线程同时开启事务的情况,这样会出现以下情况:

  • 脏读
  • 重复读
  • 幻读
  • ......

为了避免情况的发生,需要设置事务隔离级别。

mysql 中的隔离级别有如下 4 种:

  • read uncommitted:读未提交
    • 最低级别
    • 该级别下的事务会读取到另一事务中未提交的数据,称为:脏读(dirty read),这是很危险的,所以很少用
  • read committed:读已提交
    • 大多数据库管理系统的默认隔离级别,如 oracle
    • 该级别下的事务只能读取其他事务已经提交的内容
    • 可避免脏读,但不能避免 不可重复读、幻读。
    • 不可重复读:指事务内重复读取别的线程已经提交的数据,但两次读取的结果不一致,原因是查询过程中其他事务做了更新操作。
    • 幻读:指在一个事务内两次查询中数据条数不一致,原因是查询过程中其他事务做了添加操作。
    • 不可重复读与幻读严格上说不是错误,但其情况不符合实际需求。
  • repeatable read:可重复读
    • MySQL 的默认事务隔离级别
    • 避免脏读、不可重复读问题
    • 会出现幻读情况
    • 确保同一事务的多个实例在并发读取数据时,看到的是相同的数据
  • serializable:可串行化
    • 事务的最高隔离级别
    • 会对事务强制排序,使其不发生冲突
    • 解决脏读、幻读、不可重复读问题。
    • 实际上就是在读数据时,进行加锁操作,可能导致大量的超时现象和锁争

4.1、脏读演示

脏读:一个事务读取了另外一个事务未提交的数据。

如 a 向 b 进货,a开启事务执行下述操作:

start transaction;
update account set money=money-10 where name='a';
update account set money=money+10 where name='b';

这时,a中的事务没有提交,通知 b 查询账户,而 b 的隔离级别低,就会读取到 a 中未提交的数据,b发现账户增加了 10元,于是向 a 发货,等 b 发货后,a 回滚事务,此时 b 就会亏损。如下操作演示上述问题:

1、设置 b 中的事务隔离级别

mysql 中默认隔离级别为repeatable read:可重复读

这里设置其隔离级别为:read uncommitted:

set session transaction isolation level read uncommitted;

session:当前会话

transaction:事务

isolation:隔离

level:级别

read uncommitted:当前隔离级别

查询事务隔离级别为:

select @@transaction_isolation;# mysql8

可发现修改成功。

2、演示脏读

b账户:先开启一个事务,在其中查询余额信息

a账户:开启事务,执行转账

start transaction;
update account set money=money-10 where name='a';
update account set money=money+10 where name='b';

b账户:查询账户余额

发现账户显示钱已到帐,可以发货,当发货后,a账户回滚事务,这样 b账户就会亏损

当 b账户设置隔离级别为:读已提交 后,再次执行上述操作,发现 b账户中没有变化。

4.2、演示不可重复读

指事务中两次查询结果不一致,原因是查询过程中其他事务做了更新操作。

例如:银行统计报表期间,第一次 a账户有 100元,第二次查询 a账户有 99元,原因是统计期间 a账户取出了 10元,这样会导致多次统计报表的结果不一致。

演示:

b账户:开启事务,在事务中查询账户余额信息

a账户:直接修改数据,不用开启事务

b账户:查询数据:

当设置 b账户事务隔离级别为 :repeatable read;时,重复上述操作:

发现不变。

4.3、演示幻读

指在一个事务中两次查询中数据条数不一致,因为其他事务做了插入操作

b账户:事务隔离级别设置为 :read committed;且查询账户余额

a账户:直接插入,不用开启事务

b账户:查询

发现账户多数据

当需改b账户事务隔离级别为:重复读,再次执行上述操作,结果如下。

发现结果一致。

本文转载于网络 如有侵权请联系删除

相关文章

  • 代码实现java8元空间溢出

    最近组内项目报了一个错,大概原因就是元空间的问题。虽然问题解决了,但是对于作者来说感觉还是一头雾水,为啥一头雾水?因为我们知道元空间在java8中替代的是java7中的永久代,永久代就是存储类信息,我们用到的类都要存放到这块空间。但是在java8中元空间在堆外。那么元空间的出错就成了容量太小装不下项目运行所需要的类?那么又是何种原因导致项目会不断生成新的类?我们知道java的动态代理会生成代理类,代理类的特点就是类名后边很多莫名其妙的字符。所以我们的元空间导致的问题很大原因上还是使用了动态代理。而且这些动态代理类被无限的生成了并且没有来得及被卸载,或者被卸载了但是其生成的对象还在。那么咋实现一下如何让元空间溢出吧。编写一段代码:@RestController @RequestMapping("/v") publicclassUserController{ Loggerlogger=LoggerFactory.getLogger(UserController.class); @Autowired privateThreadServicethreadService;

  • 4、javascript中sort方法的完整解析

    4、javascript中sort方法的完整解析说起对数组的排序,大家能想到的应该是冒泡排序,快速排序,sort排序,以及希尔排序吧,但是可能对sort排序只停留再数组层面(每个元素均是数字或者字符串),事实上,它还可以对对象进行排序。原理是:不管元素是什么类型,sort排序始终是根据元素的unicode编码进行的下面来分别看下各种情况:元素为数字或者字符串:先从简单的开始,大家都知道sort()函数比较的是ASCII码的大小,而且而且而且:Array的sort()方法默认把所有元素先转换为String再排序,所以就有以下问题。vararr1=[10,1,5,2,3]; arr1.sort(); console.log(arr1); 复制结果转换成字符串比较,'10’排在了’2’的前面,因为字符’1’比字符’2’的ASCII码小[语法]:arr.sort()arr.sort(compareFunction)[参数]:compareFunction可选。用来指定按某种顺序进行排列的函数。如果省略,元素按照转换为的字符串的诸个字符的Unicode位点进行排序。[返回值]:返回排序

  • setup vs 5 react hooks,助你避开"沟"中陷阱

    setupvs5reacthooks,助你避开"沟"中陷阱序言本文主题围绕concent的setup和react的五把钩子来展开,既然提到了setup就离不开compositionapi这个关键词,准确的说setup是由compositionapi带出来的概览,而compositionapi(组合api)和optionalapi(可选api)两种组织代码的方式,相信大家在vue3各种相关的介绍文里已经了解到不少了,它们可以同时存在,并非强制你只能使用哪一种,但组合api两大优势的确让开发者们更倾向于使用它来替代可选api。以函数为基础单位来打包可复用逻辑,并注入到任意组件,让视图和业务解耦更优雅让相同功能的业务更加紧密的放置到一起,不被割裂开,提高开发与维护体验以上两点在react里均被hook优雅的解决了,那么相比hook,组合api还具有其他什么优势呢?相信已有小伙伴在尤大介绍组合api时已经知道,组合api是静态定义的,解决了hook必需每次渲染都重新生成临时闭包函数的性能问题,也没有了hook里闭包旧值陷阱,人工检测依赖等编码体验问题。但是,react是al

  • 域控时间同步的一次诡异事件

    【问题背景】某用户反馈域成员的时间突然跟域控不同步了,时间同步走了ntpupdate.tencentyun.com,如下图【排查步骤】查到用户的自定义镜像是基于公共镜像制作的,所以先拿公共镜像做个检验,先排除公共镜像影响1、测试发现公共镜像2008R2~2019的确都引入了ntpserver:ntpupdate.tencentyun.com,并且时间服务(w32time)都是开机自启模式powershell-command"&{(gwmiwin32_service|where{$_.name-eq'w32time'}).startmode}"-command可以简写-cpowershell-c$psversiontablepowershell-v2-c"get-service-DisplayName*windows*time*|selectName,StartType,DisplayNamepowershell-v3-c"get-service-DisplayName*windows*time*|selectName,

  • 为什么美国程序员不用加班,而中国程序员就只能996?

    按惯例,先问是不是,再问为什么。从知乎回答浏览量看,是的。那么为什么美国程序员就可以到点下班回家,而中国程序员就要每天“主动”、“无偿”加班呢?仔细看了群众们热情的回答之后,大概可以分为几派:产品经理不够通情达理,导致效率低下表演性加班,太早回家会被认为不努力工作不尊重技术人才,35岁警告⚠️中国处于后发追赶,不加班是追不上的一起来看看具体的吐槽内容:开发和PM的斗争瑟瑟发抖只敢吐槽,毕竟现实碰一碰风险太大了。产品经理的回击:都怪你太闲了?.jpg怒火还会从PM烧到煞笔客户上,不是客户压榨,催催催,PM怎么舍得压榨程序员!也有人认为,现在是痛苦的必经阶段,熬过去了,一切都会好的?静待头发掉光之前遇见合格的老板,合格的PM,合格的客户。 加班文化已然形成?也有大佬指出,多年996,国内公司已经形成加班的“文化”,谁早下班谁就是不努力。你投错胎了,建议下次重投一遍。大家都觉得理所当然,也就没人在乎劳动法是咋写的了,加,使劲加。这都是因为人太多了。内卷的必然结果,建议出去当蓝领,修修路,修修水管什么的。管理层不行老板们就是这么出来的,“兄弟”们也得跟上节奏,跟不上那就是你人不行。manage

  • Cypress系列(55)- 设置全局 URL

    如果想从头学起Cypress,可以看下面的系列文章哦https://www.cnblogs.com/poloyy/category/1768839.html背景为了绕过同源策略,当Cypress开始运行测试时,会在localhost上打开一个随机端口进行初始化直到遇见第一个cy.visit()命令里的URL才匹配被测应用程序的URL当Cypress以交互模式启动时,会看到Cypress先运行在localhost上然后又切换到URL重新运行(多消耗了一部分时间)设置全局URL做法在cypress.json中设置baseUrl优势可以在运行时节省Cypress匹配被测应用程序URl的时间还可以在编写待访问的URL时,忽略baseUrl,直接写后面的路径小栗子//不加baseUrl的写法 cy.visit('https://example.cypress.io/commands/actions') //加了上面baseUrl的写法 cy.visit('/commands/actions')复制

  • Hack the box 上线最新炫酷功能

    今天群友有人提醒Hackthebox上线了最新的Pwnbox,上去体验了一把,非常炫酷。Pwnbox提供了ssh终端连接,以及浏览器客户端的VNC端,使用体验不错,这样只要你访问HTB的稳定性不错,就会有非常好的体验了。 Pwnbox首页点击即可进入。进入之后需要选择Location,目前有6个Location可供选择。 点击Start后就可以启动机器了,启动完毕后就可以显示机器主机名、用户名以及密码。可以选择使用SSH客户端或者网页端终端来进行连接。如果通过网页端进入,就直接进入系统界面,系统感觉还是比较酷的,尤其是壁纸。系统里面已经预装了还多应用,甚至还包括Pycharm,以及其它常用的安全工具。终端的网络可以推或者拉Github代码仓库,速度还可以,比国内肯定快多了,也可以自由安装软件。连接HTB欧洲机器速度也比较稳定,大概在100毫秒左右。 总体来说,这个新功能还是备受瞩目的,大受好评。不过目前这个功能仍然在beta阶段,且仅限VIP用户,每个月也只有24小时。希望正式开放后,可以延迟时长。

  • 【趣解编程】变量

    Paste_Image.png变量就是“容器”。如果把编程比作做菜的话,变量就是那些碗盆瓢勺,或装着原材料,或在做菜的过程中临时的摆放半成品,或装着最后的成品菜。变量是有大小的,就像锅碗瓢盆也有大小一样,存放在容器里的东西是有限度的,装太多,就会装不下。有些语言中,变量是有类型限制的,就像我们对容器限制了它们专门盛放不同的材料:装米的,装面的,装水的,装油盐酱醋的...比如在Java里:Stringstr="Hello";//装字符串 intnum=12345;//装数字 booleanflag=true;//装逻辑是/否复制而有些语言,一个变量可以装任何类型的东西,就像我们不讲究的在一个容器里装任何东西。比如在JavaScript里:varanything="Hello"; anything=12345; anything=true;复制什么是“变量名”?太好理解了,就是贴在每个容器上的那张标签纸,上面写了:米,水,油,盐...

  • Android开发之漫漫长途 Ⅱ——Activity的显示之Window和View(1)

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列。该系列引用了《Android开发艺术探索》以及《深入理解Android卷Ⅰ,Ⅱ》中的相关知识,另外也借鉴了其他的优质博客,在此向各位大神表示感谢,膜拜!!!另外,本系列文章知识可能需要有一定Android开发基础和项目经验的同学才能更好理解,也就是说该系列文章面向的是Android中高级开发工程师。还是先来个最简单的HelloWord代码,用AndroidStudio3.0新建项目(一直使用默认)后会自动生成一个HelloWorld的项目,如下:activity_main.xml<?xmlversion="1.0"encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="

  • 云数据中心网络虚拟化——大二层技术巡礼之数据平面的演化

    开始讲解数据平面的虚拟化前,我们首先来看一看数据中心网络典型的网络拓扑。左图3层分别为接入、汇聚和核心层,一般来说,接入层负责制定虚拟机的接入策略,汇聚层负责二层的传输,核心层作为网关负责三层的互通。当然了,如果汇聚层设备能够作为网关,也可以简化为右图的两层拓扑。数据中心传统的虚拟化做法是VLAN+xSTP+自学习,VLAN负责隔离,STP负责拓扑整合,自学习负责转发,三者贯穿于传统数据中心的二层网络。不过三者各有各的问题:VLAN虽然简单成熟,但作为虚网的标签可用的只有4094个;自学习要依靠泛洪这种极度浪费资源的行为来在二层探路,而且汇聚/核心层设备MAC地址表压力太大;xSTP更是老大难的问题——收敛慢、规模受限、链路利用率低、配置复杂等等,还要考虑如何与其他二层协议配合设计。虽然有诸多的问题,但传统数据中心毕竟规模有限,倒也对付的过去。2006年,亚马逊推出了AWS,开启了公有云的时代,大二层网络的呼声越来越高。面对着越来越多的用户,面对着越来越大的流量压力和被迫闲置的链路带宽,数据中心网络的转型迫在眉睫。虽然结合之前讲过的控制平面虚拟化技术,能够在一定程度上弱化上述问题,不过

  • 合并两个排序的链表

    前言给定两个递增排序的链表,如何将这两个链表合并?合并后的链表依然按照递增排序。本文就跟大家分享一种解决方案,欢迎各位感兴趣的开发者阅读本文。思路分析经过前面的学习,我们知道了有关链表的操作可以用指针来完成。同样的,这个问题也可以用双指针的思路来实现:p1指针指向链表1的头节点p2指针指向链表2的头节点声明一个变量存储合并后的链表,比对两个指针指向的节点值大小:如果p1指针指向的节点值比p2指向的值小,合并后的链表节点就取p1节点的值,p1指针继续向前走,进行下一轮的比对如果p2指针指向的节点值比p1指向的值小,合并后的链表节点就取p2节点的值,p2指针继续向前走,进行下一轮的比对当p1节点指向null时,合并后的链表节点就为p2所指向的链表节点;当p2节点指向null时,合并后的链表节点就为p1所指向的链表节点。 image-20220627070633451实现代码看完上述分析后,聪明的开发者已经想到代码怎么写了。没错,这就是典型的递归思路,代码如下:声明一个函数MergeLinkedList,它接受2个参数:递增排序的链表1,递增排序的链表2递归的基线条件:链表1为null就返回

  • 钉钉扫码登录web网站

    钉钉扫码登录网站 前言  由于本公司前后台分离,这里主要讲述后台的实现逻辑与过程,前端相关的一略而过。前端我们采用的是把二维码内嵌到我们的网页中。 流程如下: 1.登录钉钉后台创建一个企业应用 2.根据appid与app_secret获取access_token access_token有效期为2个小时,可以自行缓存。 /** *获取accesstoken有效期2个小时,有效期获取,值不变,时间延长 *@return */ publicstaticDdResultgetAccessToken(Stringappid,Stringsecret){ StringrequestUrl="https://oapi.dingtalk.com/sns/gettoken?appid=APPID&appsecret=APPSECRET"; requestUrl=requestUrl.replace("APPID",appid).replace("APPSECRET",secret); StringaccessTokenResult=HttpClientUtil.doGet(requ

  • 根据图片的链接地址获取图片的后缀名

    某天一朋友突然发来一个地址,问我怎么获取这张图片的后缀名?? 将代码放在下面以供参考: usingSystem; usingSystem.Drawing; usingSystem.Drawing.Imaging; usingSystem.IO; usingSystem.Net; namespaceConsoleApp3 { classProgram { staticvoidMain(string[]args) { varimgUrl="http://emoji.qpic.cn/wx_emoji/haiannhLHhY7B1tX6eZ2BGNh9kzx3VCQ2MJfSQkSgE47sEXofVVoPCiaZKYbPcyQhS/"; varimgByte=GetBytesFromUrl(imgUrl); if(imgByte.Length>0) { varimage=BytesToImage(imgByte); if(image!=null) { varmimeType=GetMimeType(image); if(!string.IsNullOrEmpty(mimeType)

  • 首届CCF真题1-相反数

    问题描述 有N个非零且各不相同的整数。请你编一个程序求出它们中有多少对相反数(a和−a为一对相反数)。复制 输入格式 第一行包含一个正整数N。(1≤N≤500)。 第二行为N个用单个空格隔开的非零整数,每个数的绝对值不超过 复制 1000,保证这些整数各不相同。复制 输出格式 只输出一个整数,即这N个数中包含多少对相反数。 复制 输入样例 5 123-1-2 复制 输出样例 2 复制 1#include<iostream> 2#include<map> 3#include"math.h" 4 5usingnamespacestd; 6 7intmain(){ 8map<int,int>j; 9intn; 10cin>>n; 11intans=0; 12for(inti=0;i<n;i++) 13{ 14intnum=0; 15cin>>num; 16num=abs(num); 17j[num]++; 18if(j[num]>1) 19ans++; 20} 21cout<<ans&

  • python 模板语言 - jinja2 金家兔

    1.语法 在jinja2中,存在三种语法: 控制结构{%%} 变量取值{{}} jinja2模板中使用{{}}语法表示一个变量,它是一种特殊的占位符。当利用jinja2进行渲染的时候,它会把这些特殊的占位符进行填充/替换,jinja2支持python中所有的Python数据类型比如列表、字段、对象等。 注释{##} 2.过滤器 变量可以通过“过滤器”进行修改,过滤器可以理解为是jinja2里面的内置函数和字符串处理函数。 常用的过滤器有: 1safe:渲染时值不转义 2capitialize:把值的首字母转换成大写,其他子母转换为小写 3lower:把值转换成小写形式 4upper:把值转换成大写形式 5title:把值中每个单词的首字母都转换成大写 6trim:把值的首尾空格去掉 7striptags:渲染之前把值中所有的HTML标签都删掉 8join:拼接多个值为字符串 9replace:替换字符串的值 10round:默认对数字进行四舍五入,也可以用参数进行控制 11int:把值转换成整型复制 那么如何使用这些过滤器呢?只需要在变量后面使用管道(|)分割,多个过滤

  • SQL注入问题

    1.SQL注入是什么?如何产生的? SQL注入(SQLi)是一种注入攻击,,可以执行恶意SQL语句。 程序开发过程中不注意规范书写sql语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET提交一些sql语句正常执行,产生Sql注入。 2.如何防止SQL注入 a.过滤掉一些常见的数据库操作关键字,或者通过系统函数来进行过滤。 b.在PHP配置文件中将Register_globals=off;设置为关闭状态 c.SQL语句书写的时候尽量不要省略小引号(tab键上面那个)和单引号 d.提高数据库命名技巧,对于一些重要的字段根据程序的特点命名,取不易被猜到的 e.对于常用的方法加以封装,避免直接暴漏SQL语句 f.开启PHP安全模式:Safe_mode=on; g.打开magic_quotes_gpc来防止SQL注入 h.控制错误信息:关闭错误提示信息,将错误信息写到系统日志。 i.使用mysqli或pdo预处理 j.不要将敏感数据保留在纯文本中 k.限制数据库权限和特权‘’

  • 【题解】space

    jzoj5970 题目大意:有\(n^4\)个点\((a,b,c,d)(1\leqslanta,b,c,d\leqslantn)\),给出\(4\)个长度为\(n\)的排列\(A,B,C,D\),表示从\((a,b,c,d)\)连向\((A_a,B_b,C_c,D_d)\)的边长度为\(1\),连向其它所有点的边长度为\(2\),求最短汉密尔顿回路长度。 由于要经过每个点一次,所以一定经过了\(n^4\)条边。所以可以将所有边的长度减\(1\),最后统计答案时再加回去。 取出所有此时长度为\(0\)的边,构成一个新图。显然每个点的出度为\(1\),又由于\(A,B,C,D\)是排列,所以每个点的入度也为\(1\),于是这个新图一定是有若干个环(可能有自环)组成。 每个环内的边的长度为\(0\),所以可以考虑把每一个环缩成一个点,任意两个缩环后的点之间的距离为\(1\)。容易发现,当图中只有\(1\)个环,则不需要在环间走,否则,在环之间走的最短长度为环的数量。 如何求出环的数量? 设两个大小为\(n\)和\(m\)的环合并表示:两个长度分别为\(n,m\)的排列\(A,B\),满足\(

  • 如何把阿里图标库的图标生成代码并应用于自己的项目

    有时候需要用很多图标去完成一定的页面效果和工作展现,框架内置的图标可能满足不了我们的需求,有个很好的图标库想必大家都知道-----就是阿里图标库。那么我们如何才能够把阿狸图标库的图标引用到自己的项目中呢?耐着性子往下看吧!阿里图标库地址:https://www.iconfont.cn/1.根据所需搜索到想要的图标,鼠标悬停,点击添加到购物车2.点击购物车3.点击添加至项目4.选择添加到一个项目里面,点击确定5.点击fontclass的选项,可以看到你添加过的图标,下面的英文对应的是图标代码,点击下载至本地。6.你会的到一个download的压缩包,解压文件7.复制除第一个二文件其余的文件至你的项目资源目录8.引用iconfont.css至你的前端项目请注意引用文件路径的正确性。9.使用的时候第一个类名是固定的iconfont第二个类名是你所需要的类名,取自于fontClass代码

  • 用js实现保存文本框信息

    看知乎等大型网站都实现自动保存文本框内容,我就用js简单地实现这个功能,用到了onblur事件跟onload事件,保存到本地cookie(为减轻服务器负担,一般人都不加用session来做吧?) <bodyonload="savecontent()"> <scripttype="text/javascript"> functionsavecontent() { varkk=""; varcontent=document.getElementById("text").value; if(content.length>1) { setCookie("ct",content,30); //document.cookie="ct="+content; if((kk=getCookie("ct")).length>0) { //alert(kk); document.getElementById("text").value=kk; document.getElementById("tips").innerHTML="内容已自动保存

  • 2019/08/24最新进展

    今天完成的工作如下: 1.在高德开发者平台上注册开发者账号,下载高德地图sdk。 2.在AndroidStudio上创建新Project,包名为com.amap.YLIAD.demo。 3.在高德开发者平台上创建新应用,获得应用YLIAD的key。 4.阅读高德地图的官方文档,在新创建的project中进行配置,导入jar包。 5.在手机上安装了新创建的project,并且可以显示高德地图,该地图可以进行缩放。 找到我们学校: 今晚以及明天的计划如下: 1.阅读官方文档,在project上实现目的地导航功能。 2.根据我们在墨刀上所设计的软件,在project上实现汽车导航功能。 3.继续完成暑假的任务,读论文,完善安全距离模型。要把能见度和路面湿滑程度加进去。 4.再去看看暑假写的求汽车安全速度的神经网络代码,在matlab上再跑跑程序。 心得体会: 1.今天遇到的问题可多了,呵呵。如何找到SHA1,如何使用AndroidStudio,如何在手机上安装相应apk,安装过程中出现一个很让人摸不着头脑的bug,查了很久才知道原来是要把华为手机的一项权限关掉。在导入高德地图的过程中遇到

  • git 加速

    gitclone加速 使用git镜像地址 将github.com换成github.com.cnpmjs.org git文件下载加速 通过下方链接,里边有使用说明(或者自行搜索谷歌插件) https://shrill-pond-3e81.hunsh.workers.dev 通过配置host提速 查ip: github.global.ssl.fastly.net github.com 修改host: Windows上的hosts文件路径在C:\Windows\System32\drivers\etc\hosts Linux的hosts文件路径在:sudovim/etc/hosts 末尾添加 XXX.XXX.XXX.XXXgithub.global-ssl.fastly.net XXX.XXX.XXX.XXXgithub.com 刷新DNS Winodws:CMD:ipconfig/flushdns Linux:sudo/etc/init.d/networkingrestart 通过gitee 添加仓库->导入已有仓库,等待片刻即可~~

相关推荐

推荐阅读