当前位置: 首页 > news >正文

AAA 数据库事务隔离级别及死锁

目录

一、事务的四大特性(ACID)

1. 原子性(atomicity):

2. 一致性(consistency):

3. 隔离性(isolation):

4. 持久性(durability):

二、死锁的产生及解决方法

三、事务的四种隔离级别

0 .封锁协议

1 读未提交(Read uncommitted):

2. 读已提交(Read committed):

3. 可重复读(Repeatable read)

4. 串行化(Serializable)

四、MVCC(Multi-Version Concurrency Control)

1 为什么会有MVCC

2 MVCC在哪个隔离级别下才生效

3 ReadView是什么

五、不同隔离级别演示

演示准备

读未提交----->脏读

读已提交----->不可重复读

可重复读----->幻读

串行化


一、事务的四大特性(ACID)

1. 原子性(atomicity):

事务是一个原子操作,要么全部执行成功,要么全部执行失败。 事务的原子性确保一组逻辑操作,要么全部完成,要么完全不起作用。

2. 一致性(consistency):

事务失败,当前事务都会回滚,事务成功,其他事务可见

3. 隔离性(isolation):

事务的隔离性是指在并发执行的多个事务中,每个事务相互独立,互不影响

事务隔离级别越高,数据冲突的可能性就越小,但并发性能也会受到一定的影响。

4. 持久性(durability):

一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障,应用重启,也不应该对其有任何影响。

二、死锁的产生及解决方法

产生死锁的四个必要条件

  1. 互斥条件‌:进程对所分配的资源进行排他性控制,即资源在一段时间内只能被一个进程使用。
  2. 请求保持条件‌:一个进程已经获得至少一个资源,但又请求新的资源,而该资源被其他进程占用,导致该进程阻塞,但已获得的资源保持不放。
  3. 不可剥夺条件‌:进程已获得的资源在未使用完之前,不能被其他进程强行夺走,只能由获得该资源的进程主动释放。
  4. 环路等待条件‌:存在一种循环等待资源的链,链中每个进程已获得的资源同时被链中下一个进程请求,形成循环等待。

数据库死锁产生的原因及解决方案

数据库死锁产生的原因有以下几点:

  1. 多个事务同时访问同一资源,每个事务都试图获取其他事务已经持有的锁,导致互相等待,从而产生死锁。12
  1. 事务在获取锁时的顺序不同,也可能导致死锁。例如,事务A获得了资源X的锁,并尝试获取资源Y的锁,而事务B获得了资源Y的锁,并尝试获取资源X的锁。这种情况下,两个事务都无法继续执行,形成了死锁。4

解决数据库死锁的方案有以下几种:

  1. 保持锁的顺序一致:在多个事务请求资源的情况下,保持锁的请求顺序一致,可以避免死锁的发生。

  2. 尽量缩短事务的持有时间:事务持有锁的时间过长会增加死锁的风险。因此,在处理事务时,应尽量缩短事务的持有时间,尽快释放锁。

  3. 使用超时机制:如果一个事务等待锁的时间过长,可以使用超时机制来终止该事务,从而避免死锁的发生。

  4. 检测并解决死锁:数据库管理系统通常提供死锁检测机制,一旦检测出死锁,可以中止其中一个事务,从而解除死锁。同时,也可以优化锁的使用和重构事务来降低死锁的发生率。如果死锁频繁发生,可能需要增加资源,如提升服务器的处理能力或增加数据库的缓存空间。

三、事务的四种隔离级别

隔离级别脏读不可重复读幻读
读未提交可能出现可能出现可能出现
读已提交不会出现可能出现可能出现
可重复读不会出现不会出现可能出现
串行化不会出现不会出现不会出现

数据库事务的隔离级别有4种,由低到高分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable 。在事务的并发操作中可能会出现脏读,不可重复读,幻读。

0 .封锁协议

一级封锁协议(读未提交):写加写锁,读不加锁。事务T在修改数据R之前必须对其加X锁,直到事务结束才释放。以及封锁协议可以防止修改丢失,并保证事务T是可恢复的。在一级封锁协议中,如果仅仅是读数据不对其进行修改,是不需要加锁的,所以它不能保证可重复读和不读“脏”数据。

二级封锁协议是(读已提交):写加写锁,读加临时锁。一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,读完后即可释放S锁。二级封锁协议除防止丢失修改,还可进一步防止读“脏”数据。在二级封锁协议中,由于读完数据即可释放S锁,所以它不能保证可重复读。

三级封锁协议(可重复读):写加写锁,读加事务锁。一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。三级封锁协议可以防止丢失修改,读“脏"数据和不可重复读。

1 读未提交(Read uncommitted):

1.1 简述

一个事务读到了另一个事务还没有提交的数据。

1.2 事例

父亲要给儿子转账。但是转账时父亲不小心按错了数字,按成10万/月,该钱已经打到儿子的账户,但是事务还没有提交,就在这时,儿子去查看自己的储蓄卡,发现转多了9万,以为凭空多了9万非常高兴。但是父亲及时发现了不对,马上回滚差点就提交了的事务,将数字改成1万再提交。

1.3 分析

实际父亲给儿子转的还是1万,但是儿子看到的是10万。儿子看到的是父亲还没提交事务时的数据。这就是脏读。

2. 读已提交(Read committed):

2.1 简述

一个事务要等另一个事务提交后才能读取数据。

2.2 事例

儿子拿着父亲的信用卡去消费(卡里目前有10),当他买单时(父亲事务开启),收费系统事先检测到他的卡里有10万,就在这个时候!!父亲要把钱全部转出充当家用,并提交。当收费系统准备扣款时,再检测卡里的金额,发现已经没钱了(第二次检测金额当然要等待父亲转出金额事务提交完)。儿子就会很郁闷,明明卡里是有钱的…

2.3 分析

这就是读已提交,若有事务对数据进行更新操作时,读操作事务要等待这个更新操作事务提交后才能读取数据,可以解决脏读问题。但在这个事例中,出现了一个事务范围内两次相同的查询却返回了不同数据,这就是不可重复读。

3. 可重复读(Repeatable read)

3.1 简述

同一事务下,事务在执行期间,多次读取同一数据时,能够保证读取到的数据是一致的。

3.2 事例

儿子拿着信用卡去享受生活(卡里只有10万),当他买单时(事务开启,不允许其他事务的UPDATE修改操作),收费系统事先检测到他的卡里有10万。这个时候父亲不能转出金额了。接下来收费系统就可以扣款了。

3.3 分析

可重复读解决了不可重复读的问题。说到这里,应该明白的一点就是,不可重复读对应的是修改,即UPDATE操作。但是可能还会有幻读问题。因为幻读问题对应的是插入INSERT操作,而不是UPDATE操作。

3.4 什么时候会出现幻读?

3.4.1 简述

一个事务读取到了另一个事务新增的数据

3.4.2 事例

儿子某一天去消费,花了8千元,然后他的父亲去查看他今天的消费记录(全表扫描,儿子事务开启),看到确实是花了8千元,就在这个时候,儿子花了1万买了一部电脑,即新增INSERT了一条消费记录,并提交。当父亲打印儿子的消费记录清单时(儿子事务提交),发现花了1.8万元,似乎出现了幻觉,这就是幻读。

3.4.3 那怎么解决幻读问题?

串行化

4. 串行化(Serializable)

它是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率最低,比较耗费数据库性能,一般不推荐使用。

四、MVCC(Multi-Version Concurrency Control)

MVCC原理底层就是通过read view 以及undo log来实现

1 为什么会有MVCC

频繁加锁会导致数据库性能低下,引入了MVCC多版本控制来实现读写不阻塞,提高数据库性能,在多版本并发控制中,为了保证数据操作在多线程过程中,保证事务隔离的机制,降低锁竞争的压力,保证较高的并发量。在每开启一个事务时,会生成一个事务的版本号,被操作的数据会生成一条新的数据行(临时),但是在提交前对其他事务是不可见的,对于数据的更新(包括增删改)操作成功,会将这个版本号更新到数据的行中,事务提交成功,将新的版本号更新到此数据行中,这样保证了每个事务操作的数据,都是互不影响的,也不存在锁的问题。

MVCC机制的实现就是通过read-view机制与undo版本链比对机制,使得不同的事务会根据数据版本链对比规则读取同一条数据在版本链上的不同版本数据。

2 MVCC在哪个隔离级别下才生效

MVCC只在 READ COMMITTED 和 REPEATABLE READ 两个隔离级别下工作。其他两个隔离级别和MVCC不兼容,因为 READ UNCOMMITTED 总是读取最新的数据行,而不是符合当前事务版本的数据行。而 SERIALIZABLE 则会对所有读取的行都加锁。

InnoDB行数据默认隐藏列

InnoDB在每行数据都增加三个隐藏字段:一个唯一行号,一个记录创建的版本号,一个记录回滚的版本号。

3 ReadView是什么

在我们平时执行一个事务的时候,就会生成一个ReadView,ReadView的组成结构大致如下:
9571c88a62d502cd231c77657a5efb09.png

read view 参数解释

1.creator_trx_id: 当前事务id

没什么可解释,就是当前事务ID

2.m_ids:所有活跃事务的事务id

当前所有未提交的事务id构成的集合

3.min_trx_id: m_ids里最小的事务id值

当前所有未提交的事务id构成的集合里的最小的哪个事务id

4.max_trx_id: 最大事务id

下一个即将创建的事务id

Read View快照的生成时机

repeatable read级别

语句级快照

read committed级别

事务级的快照

版本链比对规则

  1. 如果被访问版本的trx_id属性值与rv中的creator_trx_id值相同 可见
  2. 如果被访问版本的trx_id属性值小于rv中的min_trx_id值 可见
  3. 如果被访问版本的trx_id属性值大于或等于rv中的max_trx_id值 不可见
  4. 如果被访问版本的trx_id属性值在rv的min_trx_id和max_trx_id之间
    4.1 trx_id在m_ids中 不可见
    4.2 trx_id不在m_ids中 可见

MVCC比对练习题

06e827b30f67c4e591f2d198c14758e0.png

在同一个事务里,针对id=1的记录,当前事务ID分别为200,99,38,15,5的行记录能查询到么,是可见的么?

200不可见、99可见、38可见、15不可见、5可见

思考题:为啥要把最小的事务id值单独作为一个字段?

时间复杂度,难道要从所有未提交的集合中去找么,依次遍历

1.版本说明

这里是8.0.33

5c1623f09669cf9cd4a79c473fd5027d.png

2. 查询mysql全局事务隔离级别

2.1 查询命令

select @@global.transaction_isolation;

2.2 默认隔离级别如下

bdb1bf7452a38d22f91a30834735c084.png

3. 注意事项

低版本的查询语句是select @@global.tx_isolation;

五、不同隔离级别演示

演示准备

创建sql语句准备

CREATE TABLE user (--自增IDid INT NOT NULL AUTO_INCREMENT,--姓名name VARCHAR(50) NOT NULL,--年龄age INT NOT NULL,--主键PRIMARY KEY (id)
);

数据准备

--插入一条记录,id为1,name为'张三',age为20
INSERT INTO user(id, name, age) VALUES (1, '张三', 20);
-- 插入一条记录,id为2,name为'李四',age为30
INSERT INTO user(id, name, age) VALUES (2, '李四', 30);
-- 插入一条记录,id为3,name为'王五',age为25
INSERT INTO user(id, name, age) VALUES (3, '王五', 25);
-- 插入一条记录,id为4,name为'赵六',age为28
INSERT INTO user(id, name, age) VALUES (4, '赵六', 28);

读未提交----->脏读

设置当前会话隔离级别为读未提交

20111f34644f04881aba5eafc6df617a.png

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

1、a 事务(客户端1) 修改 、未提交

76c6d2204f2c81302161453ebc2748ac.png

2、b事务(客户端2) 读该数据

f8c53d19c3b32a9c0209607a53f9f781.png

3、a事务(客户端1) 回滚

ec54401f582d3639e8fb5c649004f1f0.png

4、b事务(客户端2) 再读该数据 和 2步不一致,脏读

6743edc90c5a2ebec4f9240acf965a47.png

读已提交----->不可重复读

设置当前会话隔离级别为读已提交

a9d6b1693bf9aea084fcfe1e10a43f71.png

SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

1、a事务(客户端1) 修改 、未提交

1fbc9149a8e8f851eab4ae0c4edb8dea.png

2、b事务(客户端2) 读该数据

8831cc720341085552b7527695fa47df.png

3、a事务(客户端1) 提交

038a2561a5c2aa00a8ffe9e7504522a5.png

4、b事务(客户端2) 读该数据 , 不可重复读

83373894ddf043d0963f15738338bb64.png

可重复读----->幻读

设置当前会话隔离级别为可重复读

16991284a84e312bfed6dbf291954d27.png

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

1、a 事务(客户端1) 修改、未提交

13550c9b7c90e79bf9e1c00d64ee60c1.png

2、b 事务(客户端2) 读该数据

41e6a4de740ffb3b3cd50f2f9ed0c8c6.png

3、a 事务(客户端1) 提交

dffc8b9af9b31cbe170007f66a1fefec.png

4、b 事务(客户端2) 读该数据 和之前一样可重复读

2f2fe7ed0199a7ee5540ee2ebb438233.png

串行化

设置当前会话隔离级别为串行化

47ef500aadb29c29ca805ecd4113b93e.png

SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;

1、a 事务(客户端1) 读取id = 1的数据

5f0155a0f8b4096c2d615147103c28d3.png

2、b 事务(客户端2) 修改id = 1的数据,直接阻塞住

4da28ace6473fb4338676482d49f83fa.png

3、a 事务(客户端1) 提交

a7bbd3bc1eef9357044617874a32e03b.png

4、b 事务(客户端2) 获取行锁更新成功、串行执行

b5805723b1730098a461c84ef107b6c6.png

在InnoDB引擎下的的repeatable read (可重复复读)隔离级别下,快照读MVCC影响下,已经解决了幻读的问题

相关文章:

AAA 数据库事务隔离级别及死锁

目录 一、事务的四大特性(ACID) 1. 原子性(atomicity): 2. 一致性(consistency): 3. 隔离性(isolation): 4. 持久性(durability): 二、死锁的产生及解决方法 三、事务的四种隔离级别 0 .封锁协议 …...

外接数据库给streamlit等web APP带来的变化

之前我采用sreamlit制作了一个调查问卷的APP, 又使用MongoDB作为外部数据存储,隐约觉得外部数据库对于web APP具有多方面的意义,代表了web APP发展的趋势之一,似乎是作为对这种趋势的响应,streamlit官方近期开发了st.c…...

Gitpod: 我们正在离开 Kubernetes

原文:Christian Weichel - 2024.10.31 Kubernetes 似乎是构建远程、标准化和自动化开发环境的显而易见选择。我们也曾这样认为,并且花费了六年时间,致力于打造最受欢迎的云开发环境平台,并达到了互联网级的规模。我们的用户数量达…...

1.每日SQL----2024/11/7

题目: 计算用户次日留存率,即用户第二天继续登录的概率 表: iddevice_iddate121382024-05-03232142024-05-09332142024-06-15465432024-08-13523152024-08-13623152024-08-14723152024-08-15832142024-05-09932142024-08-151065432024-08-131123152024-…...

普通一本大二学生,软件工程,想考研985,想知道哪个大学的软件工程好,又不至于完全考不起的?

竞争难度适中:相较于顶尖985院校,重庆大学作为实力派985高校,其竞争烈度较为温和,考研难度适中偏易,为追求高性价比深造路径的考生提供了理想之选。 考试难度友好:重庆地区考研评分标准相对宽松&#xff0…...

「QT」几何数据类 之 QMatrix4x4 4x4矩阵类

✨博客主页何曾参静谧的博客📌文章专栏「QT」QT5程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…...

让Apache正确处理不同编码的文件避免中文乱码

安装了apache2.4.39以后&#xff0c;默认编码是UTF-8&#xff0c;不管你文件是什么编码&#xff0c;统统按这个来解析&#xff0c;因此 GB2312编码文件内的中文将显示为乱码。 <!doctype html> <html> <head><meta http-equiv"Content-Type" c…...

人员密集场所遇到突发火灾事故该如何应对

0引言 在繁华喧嚣的都市中&#xff0c;人员密集场所如购物中心、电影院、办公楼等&#xff0c;是人们日常生活不可或缺的一部分。然而&#xff0c;在这些看似繁华的背后&#xff0c;隐藏着不可忽视的安全隐患——火灾。火灾无情&#xff0c;往往在不经意间爆发&#xff0c;瞬间…...

使用QtWebEngine的Mac应用如何发布App Store

前言 因为QtWebEngine时第三方包,苹果并不直接支持进行App Store上签名和发布,所以构建和发布一个基于使用QtWebEngine的应用程序并不容易,这里我们对Qt 5.8稍微做一些修改,以便让我们的基于QtWeb引擎的应用程序并让签名能够得到苹果的许可。 QtWebEngine提供了C++和Qml的…...

微机原理与接口技术——中断系统与可编中断控制芯片8259A

目录 一、8259A 芯片介绍 二、8259A 的内部结构和引脚 三、8259A 的中断工作过程 四、8259A 的工作方式 五、8259A 的编程 六、外部中断服务程序 一、8259A 芯片介绍 Intel 8259A 是可编程中断控制器&#xff0c;可用于管理 Intel 8080/8085、8086/8088、80286/80386 的…...

【JavaEE初阶 — 多线程】Thread类的方法&线程生命周期

目录 1. start() (1) start() 的性质 (2) start() 和 Thread类 的关系 2. 终止一个线程 (1)通过共享的标记结束线程 1. 通过共享的标记结束线程 2. 关于 lamda 表达式的“变量捕获” (2) 调用interrupt()方法 1. isInterrupted() 2. currentThread() …...

面试题分享11月7日

1、ThreadLocal 是什么 是 Java 中线程的本地方法变量&#xff0c;用来存储每个线程的私有数据&#xff0c;每个线程都有它的独立副本&#xff0c;相互隔离&#xff0c;互不影响 2、ThreadLocal 实现原理 每个 ThreadLocal 都有一个 ThreadLocalMap 对象&#xff0c;用来存储…...

数据结构_哈夫曼树及其应用

构造算法的例子 构造算法的实现 初始化&#xff0c;置权值 int i, m, s1, s2;m 2 * n - 1;for (i 1; i < m; i){HT[i].lch 0;HT[i].rch 0;HT[i].parent 0;}for (i 1; i < n; i){cin >> HT[i].weight;}合并结点 // 创建哈夫曼树for (i n 1; i < m; i){s1…...

从0开始学习机器学习--Day19--学习曲线

一般来说&#xff0c;如果一个算法的表现不理想&#xff0c;那么多半是因为出现了欠拟合或过拟合问题&#xff0c;这种时候我们要做的就是搞清楚出现的是偏差问题还是方差问题&#xff0c;亦或是二者皆有&#xff0c;这有助于我们精准定位问题所在。 之前&#xff0c;我们发现…...

2.索引:深入解析 B+ 树:原理、MySQL 应用及与其他数据结构的对比

B 树是一种高效的平衡树结构&#xff0c;在数据库和文件系统中被广泛应用&#xff0c;尤其在 MySQL 中&#xff0c;InnoDB 存储引擎通过 B 树实现索引结构&#xff0c;提升了大数据量条件下的查询性能。 本文将深入介绍 B 树的原理和设计特点&#xff0c;分析 MySQL 中使用 B …...

[全网最细数据结构完整版]第六篇:3分钟带你吃透栈并模拟实现

目录 1->栈的概念和结构 1.1栈的概念 1.2栈的结构 2->栈的实现 2.1定义关于栈的结构体和各种函数 2.2栈的初始化 STInit 函数 2.3栈的销毁 STDestroy 函数 2.4栈的插入操作 STPush 函数 2.5栈的判断是否为空操作 STEmpty 函数 2.6栈的删除操作 STPop 函数 2.7…...

如何在 Docker 容器中启动 X11 图形界面程序

如何在 Docker 容器中启动 X11 图形界面程序 在使用 Docker 时&#xff0c;我们通常会发现&#xff0c;容器中的图形应用没法直接显示到宿主机的界面上。不过&#xff0c;我们可以通过共享 X11 的 Unix 套接字&#xff0c;让容器把显示数据传递给宿主机的 X11 服务器&#xff…...

pycharm保存是自动格式化

在PyCharm中设置保存时自动格式化代码&#xff0c;可以按照以下步骤进行&#xff1a; 1. 打开设置 在Windows和Linux系统中&#xff0c;可以通过File&#xff08;文件&#xff09;->Settings&#xff08;设置&#xff09;打开设置窗口&#xff1b;在Mac系统中&#xff0c;…...

.netCore WebAPI中字符串加密与解密

In today’s digital landscape, securing sensitive information is more critical than ever. If you’re using ASP.NET Core, you might store configuration settings in appsettings.json. However, hardcoding sensitive data like connection strings or API keys in p…...

Next.js + Move 石头剪刀布

rock-paper-scissors 写在前面 本地 源码&#xff1a;https://github.com/zcy1024/SuiStudy/tree/main/rock-paper-scissors # 或其它等价的命令来安装依赖并将项目跑起来 pnpm install pnpm run dev # http://localhost:3000/在线&#xff08;如果没过期的话&#xff09; …...

[面试]关于Redis 的持久化你了解吗

Redis的持久化是指Redis服务器在关闭或重启时&#xff0c;将内存中的数据保存到磁盘上的一种机制。Redis支持多种持久化方式。 一、RDB&#xff08;Redis Database&#xff09;持久化 RDB持久化是Redis默认采用的持久化方式&#xff0c;它将Redis在某个时间点的数据保存到磁盘上…...

Systemd:tmpfiles

Systemd提供了一个结构化的可配置方法来管理临时文件和目录,即systemd-tmpfiles,可以创建、删除和管理临时文件的服务。 $ systemctl list-units --all | grep systemd-tmpfilessystemd-tmpfiles-clean.service load…...

【Flutter 内嵌 android 原生 View以及相互跳转】

Flutter 内嵌 android 原生 View以及相互跳转 一. 内嵌android 原生View二、android 与 flutter 相互跳转 一. 内嵌android 原生View 在android 工程的包名下&#xff0c;也可在MainActivity创建 android 原生view &#xff0c;继承PlatformView // 1.自定义textview public st…...

python externally-managed-environment 外部管理环境

https://realpython.com/python-virtual-environments-a-primer/?refyaolong.net#why-do-you-need-virtual-environments 简而言之&#xff0c; pip 默认会将您安装的所有外部包放置在 Python 安装路径/site-packages/ 的文件夹中一些Linux 和 macOS操作系统 预装了内部的 P…...

前端 | MYTED单篇TED词汇学习功能优化

文章目录 &#x1f4da;实现效果&#x1f407;before&#x1f407;after &#x1f4da;模块实现解析&#x1f407;html&#x1f407;css&#x1f407;javascript &#x1f4da;实现效果 &#x1f407;before 点击TED单篇词汇表按钮&#xff0c;选择对应TED打卡号&#xff0c;…...

64 mysql 的 表锁

前言 我们这里来说的就是 我们在 mysql 这边常见的 几种锁 行共享锁, 行排他锁, 表意向共享锁, 表意向排他锁, 表共享锁, 表排他锁 我们前面了解了行共享锁, 行排他锁, 表意向共享锁, 表意向排他锁 等等相关 我们这里 来看一下 表共享锁, 表排他锁 的获取, 以及 和 其他表级…...

【计网不挂科】计算机网络期末考试——【选择题&填空题&判断题&简述题】题库(1)

前言 大家好吖&#xff0c;欢迎来到 YY 滴计算机网络 系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 本博客主要内容&#xff0c;收纳了一部门基本的计算机网络题目&#xff0c;供yy应对期中考试复习。大家可以参考 欢迎订阅 YY滴其他专栏&#xff01;…...

ajax关于axios库的运用小案例

AJAX案例 图书管理 四大功能&#xff1a; 展示图书删除图书编辑图书信息新增图书 步骤 1.bootstrap弹窗来实现新增和编辑图书时出现的弹窗 有两种方案&#xff1a; a.可以用自带的属性来进行弹窗的显示和隐藏 b.可以通过JS进行控制&#xff0c;此操作可以进行自定义&am…...

微搭低代码入门01变量

目录 1 变量的定义2 变量的赋值3 变量的类型4 算术运算符5 字符串的连接6 模板字符串7 检查变量的类型8 解构赋值8.1 数组的解构赋值8.2 对象的解构赋值 9 类型转换9.1 转换为字符串9.2 转换为数字9.3 转换为布尔值 总结 好些零基础的同学&#xff0c;在使用低代码的时候&#…...

盘点2024年10款视频剪辑,哪款值得pick!!

在这个短视频盛行的时代&#xff0c;如何让我们的故事更生动有趣呢&#xff1f;那就要对短视频进行修饰了。这就需要借助视频剪辑工具&#xff1a;而一款好的工具不仅仅是视频的“美颜”&#xff0c;更是创意的灵魂所在&#xff01;想象一下&#xff0c;运用一款功能齐全的剪辑…...