云监控(华为) | 实训学习day4(10)

SpringBoot增删改的细节研究

一、Spring boot增的安全性

1.开启数据库的事务

SpringBoot中Service层有事务(保证操作成功)

两个用户操作,同时增加同一条数据(用户名,密码一致)

验证内容,开启事务

Set autocommit=0 不提交,操作表在内存中

两个用户开启事务,插入同一条数据,会出现线程阻塞,某个用户一直死机。

当业务出现问题时,会有rollback方法回滚。

Commit提交,提交后会内存数据到表中。

当B成功commit后,数据表有新的数据,B成功等待A的动作,A动作取消,B就成功。

看出:插入同一条数据,会出现线程阻塞,某个用户一直死机

实质:插入同一个id,id是主键primary key

Sql语句:

原因:用户不知道id

 

结论:

插入数据时,insert不要求用户输入primary key,这是主键值,就可以成功解决插入数据的阻塞问题。

解决学号:学号用户输入,查询学号是否重,然后插入。

二、Spring boot删的安全性

两个事务,删除同一id的用户

(1)有无阻塞:在删除同一id时有阻塞问题.

(2)数据是否安全.数据是安全,,回滚不删除,提交就删除了.

解决阻塞:不允许删除同一个id,用户把表加载内存,不存在一个id

进入事务前,先查是否有id,有id中可以删除,没有id不允许删除.

 三、Spring boot更新的安全性

两个事务,两个用户同时更新一个数据的

得现结论:更新时数据不安全

解决方法: (乐观锁,悲观锁)

  1. 加锁. Synchronized,速度下降

  1. 乐观锁

CAB模式 内存有一个旧值,修改时把旧值改新值,修改时旧值与内存旧值对比,如果一致允许修改,不一致不允许改。

实现:在数据表多一个字段version版本。

为myuser表添加一列

 

查询表时有版本version

使用乐观锁

  1. 为表增加一列version
  2. 发生更新,更新一次,把version值加1,更新条件是id和version一起作用的结果;

第一步,改sql语句

第二步:表加一列version,对应java bean多一个字段version

最后提交更新的页面多一个version的提交

Updatepage页面多一个version的提交

四、前端页面

使用bootstrap

开发按API文档

移动端

自适应:内容随宽度缩小而缩小

响应式:宽度达到一定程度时,元素发生变化(折叠或隐藏)

不使用文档中的支持文件

百度页面搜索bootcdn

网站调用前端框架,速度快

击bootcdn的开源页面

在网站中搜bootstrap

第一个链接就是网站

进入链接

一个是css文件,没有后缀 ,只有bootstrap

点击后面的复制link标签

复制到myuser.html的head中

再找js,bootstrap5找bundle后缀的

复制的script标签,放在myuser.html的head中.

从官方得到,需要两个

了解bootstrap 一行12列

           

布局以row和col为准,container居中,text-center文字居中.

三列左右留空白

把table表格放中间

看bootstrap,左边有tables

表格项设置

在表格上,使用table表格样式,table-warning表示警告色,黄色,table-striped表示单数行深色,偶数行浅色

还有按钮

这里可以选择合适的

红色的按钮删除,蓝色的用于修改。

Btn-danger红色, btn-primary 蓝色  

加入背景图片

可以网络地址

加在body上

 

加图片的相关属性

  1. 改addpage

与输入表单有关的找输入框组

 

用到的输入框组,选择合适的样式

然后设置按钮的样式.

使用br调整竖向距离。

最后可以加背景

  1. updatepage页面

同addpage页面,然后代码做修改.

        

           代码实现

   

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/html">
<head><meta charset="UTF-8"><title>添加用户</title><link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/5.3.3/css/bootstrap.css" rel="stylesheet"><script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/5.3.3/js/bootstrap.bundle.js"></script>
</head>
<body><div class="container text-center"><div class="row"><div class="col"></div><div class="col"><br/><br/><h3>注册页面</h3><br/><!--添加用户使用表单form,action提交地址(由谁处理)--><form action="/user/add" method="post"><div class="input-group input-group-lg"><span class="input-group-text">用户名:</span><input type="text" class="form-control" name="username"/></div><br/><div class="input-group input-group-lg"><span class="input-group-text">密&nbsp;&nbsp;&nbsp;码:</span><input type="text" class="form-control" name="password"/></div><br/><button type="submit" class="btn btn-outline-success">注册</button></form></div><div class="col"></div></div>
</div></body>
</html>
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>显示用户</title><link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/5.3.3/css/bootstrap.css" rel="stylesheet"><script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/5.3.3/js/bootstrap.bundle.js"></script></head>
<body ><div class="container text-center"><div class="row"><div class="col"></div><div class="col"><br/><h1 class="text-center">用户列表展示</h1><br/><table class="table table-bordered border-primary"><tr class="table-info"><br/><td class="table-info">id</td><td class="table-info">用户名</td><td class="table-info">用户密码</td><td class="table-info">操作</td></tr><tr th:each="item:${myusers}" class="table-info"><td th:text="${item.id}" class="table-info"></td><td th:text="${item.username}" class="table-info"></td><td th:text="${item.password}" class="table-info"></td><td><button type="button" th:onclick="|ondel(${item.id})|"  class="btn btn-danger">删除</button><button type="button" th:onclick="|onupdate(${item.id})|" class="btn btn-primary">修改</button></td></tr></table></div><div class="col"></div></div>
</div><script>function onupdate(id){//修改不需要跳转,显示原始信息window.location.href="/user/orign?id="+id;}function ondel(id){//先确认是否删除answer=confirm("是否需要执行删除操作?")if(answer==true){// 地址栏地址window.location.href="/user/del?id="+id;}}
</script></body>
</html>
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org" >
<head><meta charset="UTF-8"><title>更新页面</title><link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/5.3.3/css/bootstrap.css" rel="stylesheet"><script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/5.3.3/js/bootstrap.bundle.js"></script></head>
<body>
<div class="container text-center"><div class="row"><div class="col"></div><div class="col"><br/><br/><br/><h3>用户信息更新</h3><br/><br/><form action="/user/update" method="post"><input type="hidden" th:value="${oneuser.id}" name="id"/><input type="hidden" th:value="${oneuser.version}" name="version"/><div class="input-group input-group-lg"><span class="input-group-text">用户名:</span><input th:value="${oneuser.username}" name="username"/></div><br/><div class="input-group input-group-lg"><span class="input-group-text">密&nbsp;&nbsp;&nbsp;码:</span><input th:value="${oneuser.password}" name="password"/></div><br/><br/><button type="submit" class="btn btn-outline-dark">更新</button></form></div><div class="col"></div></div>
</div></body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/873404.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL:基础操作(增删查改)

目录 一、库的操作 创建数据库 查看数据库 显示创建语句 修改数据库 删除数据库 备份和恢复 二、表的操作 创建表 查看表结构 修改表 删除表 三、表的增删查改 新增数据 插入否则更新 插入查询的结果 查找数据 为查询结果指定别名 结果去重 where 条件 结…

【Jmeter】记录一次Jmeter实战测试

Jmeter实战 1、需求2、实现2.1、新建线程组2.2、导入参数2.3、新建HTTP请求2.4、添加监听器2.5、结果 1、需求 查询某个接口在高并发场景下的响应时间(loadtime)&#xff0c;需求需要响应在50ms以内&#xff0c;接下来用Jmeter测试一下 Jmeter安装见文章《Jemeter安装教程&am…

极狐GitLab Git LFS(大文件存储)如何管理?

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab &#xff1a;https://gitlab.cn/install?channelcontent&utm_sourcecsdn 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署…

解决xshell连接不上ubuntu首次安装的虚拟机问题

首次安装完虚拟机&#xff0c;主机和虚拟机之间互ping都没问题&#xff0c;但是xshell登不上去&#xff0c;基本上原因就是虚拟机没有安装ssh服务。 1、关闭防火墙 sudo ufw disable 2、开发22端口 sudo ufw allow 22 3、最后安装ssh sudo apt-get install openssh-serve…

日文医学文献pdf怎么翻译

翻译日文医学文献的PDF可以通过以下几个步骤进行&#xff1a; 1、提取文本&#xff1a; 如果PDF文档是扫描版或者图片格式&#xff0c;可以使用OCR&#xff08;光学字符识别&#xff09;软件提取文本。常用的OCR工具有Adobe Acrobat、ABBYY FineReader等。 如果PDF文档已经是…

多层全连接神经网络(四)---简单的前向网络

神经网络神经元概念部分有需要会单独再讲 激活函数 1. Sigmoid Sigmoid 非线性激活函数的数学表达式是 σ(z) &#xff0c;其图形如图 3.14所示。目前我们知道 Sigmoid 激活函数是将一个实数输入转化到 0~1 之间的输出&#xff0c;具体来说也就是将越大的负数转化到越靠近 0…

C/C++蓝屏整人代码

文章目录 &#x1f4d2;程序效果 &#x1f4d2;具体步骤 1.隐藏任务栏 2.调整cmd窗口大小 3.调整cmd窗口屏幕颜色 4.完整代码 &#x1f4d2;代码详解 &#x1f680;欢迎互三&#x1f449;&#xff1a;程序猿方梓燚 &#x1f48e;&#x1f48e; &#x1f680;关注博主&a…

笔记 7 :linux 011 注释,函 bread () , get_hash_table () , find_buffer ()

&#xff08;57&#xff09;接着介绍另一个读盘块的函数 bread&#xff08;&#xff09;&#xff1a; &#xff08;58&#xff09;因为 函数 get_blk&#xff08;&#xff09;大量调用了其它函数&#xff0c;一版面列举不完&#xff0c;故对其调用的函数先行注释&#xff1a;ge…

【Linux】服务器安装SSH

【Linux】服务器安装SSH 【创作不易&#xff0c;求点赞关注收藏】&#x1f600; 在Ubuntu服务器上安装并配置SSH非常简单。你可以按照以下步骤进行操作&#xff1a; 1、更新软件包列表 sudo apt-get update2、安装OpenSSH服务器: sudo apt-get install openssh-server3、启…

鲁大师2024半年报电动车智能排行:九号继续霸榜,极核本田乘胜追击

鲁大师2024年半年报正式发布&#xff0c;本次季报包含电动车智能排行&#xff0c;测试的车型为市面上主流品牌的主流车型&#xff0c;共计30款&#xff0c;全部按照评测维度更广、更专业的鲁大师电动车智慧评测2.0进行评分&#xff0c;测试的成绩均来自于鲁大师智慧硬件实验室。…

口袋奇兵游戏攻略:云手机辅助战锤入侵策略指南!

在《口袋奇兵》中&#xff0c;战锤入侵是一个重要的游戏环节&#xff0c;了解如何有效地参与战锤入侵能够帮助玩家获取更多的资源和提升自己的战力。本文将详细介绍战锤入侵的策略和技巧&#xff0c;帮助玩家在战锤入侵活动中取得更好的成绩。除了找到强力的游戏辅助&#xff0…

粉尘传感器助力面粉厂安全生产

在面粉加工行业中&#xff0c;粉尘问题一直是一个不容忽视的难题。从原料的破碎、研磨到成品的包装&#xff0c;整个生产流程中都会伴随着大量的粉尘产生。这些粉尘不仅影响生产环境&#xff0c;更对工作人员的健康、设备的安全运行以及环境保护构成严重威胁。因此&#xff0c;…

食堂采购系统开发:从需求分析到上线实施的完整指南

本篇文章&#xff0c;笔者将详细介绍食堂采购系统从需求分析到上线实施的完整过程&#xff0c;旨在为开发团队和管理者提供一个系统化的指南。 一、需求分析 1.用户需求 常见的需求包括&#xff1a; -采购计划管理 -供应商管理 -库存管理 -成本控制 -报表生成 2.系统功…

PyTorch使用细节

model.eval() &#xff1a;让BatchNorm、Dropout等失效&#xff1b; with torch.no_grad() &#xff1a; 不再缓存activation&#xff0c;节省显存&#xff1b; 这是矩阵乘法&#xff1a; y1 tensor tensor.T y2 tensor.matmul(tensor.T)y3 torch.rand_like(y1) torch.matm…

初步认识HTML

目录 一. HTML概述 二. HTML基本语法 1. HTML的基本框架 2. 标签 2.1 标签分类 2.2 标签属性 三. 基本常用标签 3.1 标题标签 3.2 段落标签 3.3 换行标签 3.4 列表 3.5 超链接 四. 特殊符号转义 五. 表格 5.1 表格的基本构成标签 5.2 表格的基本结构 5.3 表格属…

js reduce 的别样用法

let mergedItems list.reduce((accumulator, currentItem) > {let existingItem accumulator.find((item) > item.manObject_name currentItem.manObject_name);if (existingItem) {existingItem.laborCostHand currentItem.laborCostHand; //劳务费existingItem.wor…

增量预训练和微调的区别

文章目录 前言一、增量预训练和微调的区别二、代码示例1. 增量预训练示例2. 微调示例3. 代码的区别 三、数据格式1. 增量预训练2. 微调3. 示例4. 小结 四、数据量要求1. 指导原则2. 示例3. 实际操作中的考虑4. 小结 前言 增量预训练是一种在现有预训练模型的基础上&#xff0c…

有了这5个高效视频剪辑工具,你一定会爱上剪辑

如果你是个剪辑新手&#xff0c;不知道如何挑选剪辑视频的工具&#xff0c;又或者是自己目前使用的剪辑工具不理想&#xff0c;想寻找新的剪辑软件&#xff1b;那就请你看看这篇文章&#xff0c;这里介绍的5款剪辑软件都是专业&#xff0c;简单&#xff0c;又高效的剪辑工具。 …

顺序表<数据结构 C版>

目录 线性表 顺序表 动态顺序表类型 初始化 销毁 打印 检查空间是否充足&#xff08;扩容&#xff09; 尾部插入 头部插入 尾部删除 头部删除 指定位置插入 指定位置删除 查找数据 线性表 线性表是n个相同特性的数据元素组成的有限序列&#xff0c;其是一种广泛运…

解决警告Creating a tensor from a list of numpy.ndarrays is extremely slow.

我的问题是创建一个列表x[]&#xff0c;然后不断读入数据使用x.append(sample)&#xff0c;chatgpt说这样转化比较低效&#xff0c;如果预先知道样本个数&#xff0c;可以用numpy来创建数组&#xff0c;再用索引x[i]sample赋值第二种方法更快&#xff0c;直接用numpy转化一下np…