云监控(华为) | 实训学习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…

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

神经网络神经元概念部分有需要会单独再讲 激活函数 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…

鲁大师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…

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…

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

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

顺序表<数据结构 C版>

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

04 Git与远程仓库

第4章&#xff1a;Git与远程仓库 一、Gitee介绍及创建仓库 一&#xff09;获取远程仓库 ​ 使用在线的代码托管平台&#xff0c;如Gitee&#xff08;码云&#xff09;、GitHub等 ​ 自行搭建Git代码托管平台&#xff0c;如GitLab 二&#xff09;Gitee创建仓库 ​ gitee官…

Gitee使用教程2-克隆仓库(下载项目)并推送更新项目

一、下载 Gitee 仓库 1、点击克隆-复制代码 2、打开Git Bash 并输入复制的代码 下载好后&#xff0c;找不到文件在哪的可以输入 pwd 找到仓库路径 二、推送更新 Gitee 项目 1、打开 Git Bash 用 cd 命令进入你的仓库&#xff08;我的仓库名为book&#xff09; 2、添加文件到 …

Spring-Boot基础--yaml

目录 Spring-Boot配置文件 注意&#xff1a; YAML简介 YAML基础语法 YAML:数据格式 YAML文件读取配置内容 逐个注入 批量注入 ConfigurationProperties 和value的区别 Spring-Boot配置文件 Spring-Boot中不用编写.xml文件&#xff0c;但是spring-Boot中还是存在.prope…

参与开源项目 MySQL 的心得体会

前言 开源项目的数量和种类都在急剧增长&#xff0c;涵盖了从操作系统、数据库到人工智能、区块链等几乎所有的技术领域。这为技术的快速创新和迭代提供了强大的动力&#xff0c;使得新技术能够更快地普及和应用. 目录 经历 提升 挑战 良好的编程习惯 总结 经历 参与开源…

Linux Namespace

Linux namespaces 介绍 namespaces是Linux内核用来隔离内核资源的方式。通过namespaces可以让一些进程只能看到与自己相关的那部分资源。而其它的进程也只能看到与他们自己相关的资源。这两拨进程根本感知不到对方的存在。而它具体的实现细节是通过Linux namespaces来实现的。 …

(三)C++之运算符重载

一.概念 C准许以运算符命名函数&#xff01;&#xff01;&#xff01; string a “hello”; a “ world”;// (a, “world”); cout<<“hello”; // <<(cout, “hello”); 可重载的运算符 不可重载的运算符 二.成员函数式(第一个行参是对象的引用) class T…

orcad导出pdf 缺少title block

在OrCAD中导出PDF时没有Title Block 最后确认问题在这里&#xff1a; 要勾选上Title Block Visible下面的print