暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

111

原创 因果之源 2021-05-10
242

数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。
加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。
在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。

Oracle数据库的锁类型
根据保护的对象不同,Oracle数据库锁可以分为以下几大类:DML锁(data locks,数据锁),用于保护数据的完整性;DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;内部锁和闩(internal locks and latches),保护 数据库的内部结构。
DML锁的目的在于保证并发情况下的数据完整性,。在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。

当Oracle执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。TM锁包括了SS、SX、S、X 等多种模式,在数据库中用0-6来表示。不同的SQL操作产生不同类型的TM锁。

在数据行上只有X锁(排他锁)。在Oracle数据库中,当一个事务首次发起一个DML语句时就获得一个TX锁,该锁保持到事务被提交或回滚。当两个或多个会话在表的同一条记录上执行 DML语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。当第一个会话提交后,TX锁被释放,其他会话才可以加锁。

当Oracle数据库发生TX锁等待时,如果不及时处理常常会引起Oracle数据库挂起,或导致死锁的发生,产生ORA-60的错误。这些现象都会对实际应用产生极大的危害,如长时间未响应,大量事务失败等。

悲观封锁和乐观封锁
一、悲观封锁
锁在用户修改之前就发挥作用:
Select …for update(nowait)
Select * from tab1 for update
用户发出这条命令之后,oracle将会对返回集中的数据建立行级封锁,以防止其他用户的修改。
如果此时其他用户对上面返回结果集的数据进行dml或ddl操作都会返回一个错误信息或发生阻塞。
1:对返回结果集进行update或delete操作会发生阻塞。
2:对该表进行ddl操作将会报:Ora-00054:resource busy and acquire with nowait specified.
原因分析
此时Oracle已经对返回的结果集上加了排它的行级锁,所有其他对这些数据进行的修改或删除操作都必须等待这个锁的释放,产生的外在现象就是其他的操作将发生阻塞,这个这个操作commit或rollback.
同样这个查询的事务将会对该表加表级锁,不允许对该表的任何ddl操作,否则将会报出ora-00054错误::resource busy and acquire with nowait specified.

二、乐观封锁
乐观的认为数据在select出来到update进取并提交的这段时间数据不会被更改。这里面有一种潜在的危险就是由于被选出的结果集并没有被锁定,是存在一种可能被其他用户更改的可能。因此Oracle仍然建议是用悲观封锁,因为这样会更安全。

阻塞
定义:
当一个会话保持另一个会话正在请求的资源上的锁定时,就会发生阻塞。被阻塞的会话将一直挂起,直到持有锁的会话放弃锁定的资源为止。4个常见的dml语句会产生阻塞
INSERT
UPDATE
DELETE
SELECT…FOR UPDATE

INSERT
Insert发生阻塞的唯一情况就是用户拥有一个建有主键约束的表。当2个的会话同时试图向表中插入相同的数据时,其中的一个会话将被阻塞,直到另外一个会话提交或会滚。一个会话提交时,另一个会话将收到主键重复的错误。回滚时,被阻塞的会话将继续执行。
UPDATE 和DELETE当执行Update和delete操作的数据行已经被另外的会话锁定时,将会发生阻塞,直到另一个会话提交或会滚。
Select …for update
当一个用户发出select…for update的错作准备对返回的结果集进行修改时,如果结果集已经被另一个会话锁定,就是发生阻塞。需要等另一个会话结束之后才可继续执行。可以通过发出 select… for update nowait的语句来避免发生阻塞,如果资源已经被另一个会话锁定,则会返回以下错误:Ora-00054:resource busy and acquire with nowait specified.
死锁-deadlock
定义:当两个用户希望持有对方的资源时就会发生死锁.
即两个用户互相等待对方释放资源时,oracle认定为产生了死锁,在这种情况下,将以牺牲一个用户作为代价,另一个用户继续执行,牺牲的用户的事务将回滚.
例子:
1:用户1对A表进行Update,没有提交。
2:用户2对B表进行Update,没有提交。
此时双反不存在资源共享的问题。
3:如果用户2此时对A表作update,则会发生阻塞,需要等到用户一的事物结束。
4:如果此时用户1又对B表作update,则产生死锁。此时Oracle会选择其中一个用户进行会滚,使另一个用户继续执行操作。
起因 :
Oracle的死锁问题实际上很少见,如果发生,基本上都是不正确的程序设计造成的,经过调整后,基本上都会避免死锁的发生。

DML锁分类表
表1Oracle的TM锁类型
锁模式 锁描述 解释 SQL操作
0 none
1 NULL 空 Select
2 SS(Row-S) 行级共享锁,其他对象
只能查询这些数据行 Select for update、Lock for
update、Lock row share
3 SX(Row-X) 行级排它锁,
在提交前不允许做DML操作 Insert、Update、
Delete、Lock row share
4 S(Share) 共享锁 Create index、Lock share
5 SSX(S/Row-X) 共享行级排它锁 Lock share row exclusive
6 X(Exclusive) 排它锁 Alter table、Drop able、Drop index、Truncate table 、Lock exclusive
oracle 锁问题的解决

可以用Spotlight软件对数据库的运行状态进行监控。
当出现session锁时,我们要及时进行处理.

  1. 查看哪些session锁:
    SQL语句:select ‘alter system kill session ‘’’||sid||’,’||serial#||’’’;’ from v$session where sid in (select sid from v$lock where block = 1);
    SQL> select ‘alter system kill session ‘’’||sid||’,’||serial#||’’’;’ from v$session where sid in (select sid from v$lock where block = 1);
    ‘ALTERSYSTEMKILLSESSION’’’||SID||’,’||SERIAL#||’’’;’

alter system kill session ‘132,731’;
alter system kill session ‘275,15205’;
alter system kill session ‘308,206’;
alter system kill session ‘407,3510’;
2. 查看session锁.
sql语句:select s.sid, q.sql_text from v$sqltext q, v$session s
where q.address = s.sql_address
and s.sid = &sid
order by piece;
SQL> select s.sid,q.sql_text from v$sqltext q, v$session s where q.address = s.sql_address and s.sid in (select sid from v$lock where block = 1) order by piece;
SID SQL_TEXT


77 UPDATE PROFILE_USER SET ID=1,COMPANY_ID=2,CUSTOMER_ID=3,NAMED
77 _INSURED_ID=4,LOGIN=5,ROLE_ID=6,PASSWORD=7,EMAIL=8,TIME_ZON
77 E=9 WHERE PROFILE_USER.ID=:34
3 rows selected.

  1. kill锁的进程.
    SQL语句:alter system kill session ‘77,22198’;
    SQL> alter system kill session ‘391,48398’;
    System altered.

对for update的使用

在日常中,我们对for update的使用还是比较普遍的,特别是在如pl/sql developer中手工修改数据。此时只是觉得方便,而对for update真正的含义缺乏理解。

For update是Oracle提供的手工提高锁级别和范围的特例语句。Oracle的锁机制是目前各类型数据库锁机制中比较优秀的。所以,Oracle认为一般不需要用户和应用直接进行锁的控制和提升。甚至认为死锁这类锁相关问题的出现场景,大都与手工提升锁有关。所以,Oracle并不推荐使用for update作为日常开发使用。而且,在平时开发和运维中,使用了for update却忘记提交,会引起很多锁表故障。

那么,什么时候需要使用for update?就是那些需要业务层面数据独占时,可以考虑使用for update。场景上,比如火车票订票,在屏幕上显示邮票,而真正进行出票时,需要重新确定一下这个数据没有被其他客户端修改。所以,在这个确认过程中,可以使用for update。这是统一的解决方案方案问题,需要前期有所准备

Select …forupdate语句是我们经常使用手工加锁语句。通常情况下,select语句是不会对数据加锁,妨碍影响其他的DML和DDL操作。同时,在多版本一致读机制的支持下,select语句也不会被其他类型语句所阻碍。

借助for update子句,我们可以在应用程序的层面手工实现数据加锁保护操作。本篇我们就来介绍一下这个子句的用法和功能。

下面是采自Oracle官方文档《SQLLanguage Reference》中关于for update子句的说明:(请双击点开图片查看)

从for update子句的语法状态图中,我们可以看出该子句分为两个部分:加锁范围子句和加锁行为子句。下面我们分别针对两个方面的进行介绍。

加锁范围子句

在select…for update之后,可以使用of子句选择对select的特定数据表进行加锁操作。默认情况下,不使用of子句表示在select所有的数据表中加锁。

//采用默认格式for update

SQL> select * from emp where rownum<2 for update;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO


7369 SMITH CLERK 79021980-12-17 800.00 20

此时,我们观察v$lock和v$locked_object视图,可以看到锁信息。

//事务信息视图

SQL> select addr,xidusn,xidslot,xidsqn from v$transaction;

ADDR XIDUSN XIDSLOT XIDSQN


377DB5D0 7 19 808

//锁对象信息

SQL> select xidusn,xidslot,xidsqn,object_id,session_id, oracle_username from v$locked_object;

XIDUSN XIDSLOT XIDSQN OBJECT_ID SESSION_ID ORACLE_USERNAME


    7        19       808     73181        36 SCOTT

//

SQL> select owner,object_name from dba_objects where object_id=73181;

OWNER OBJECT_NAME


SCOTT EMP

//

SQL> select addr, sid, type, id1,id2,lmode, request, block from v$lock where sid=36;

ADDR SID TYPE ID1 ID2 LMODE REQUEST BLOCK


37E808F0 36 AE 100 0 4 0 0

B7DE8A44 36 TM 73181 0 3 0 0

377DB5D0 36 TX 458771 808 6 0 0

从上面的情况看,默认情况下的for update语句,效果相当于启动了一个会话级别的事务,在对应的数据表(select所涉及的所有数据表)上加入一个数据表级共享锁(TM,lmode=3)。同时,在对应的数据行中加入独占锁(TX,lmode=6)。

根据我们以前的知识,如果此时有另一个会话视图获取对应数据行的独占权限(无论是用update/delete还是另一个for update),都会以block而告终。

SQL> select sid from v$mystat where rownum<2;

  SID

   37

SQL> select * from emp where empno=7369 for update;

//系统blocking

此时系统中状态,切换到另一个用户下进行观察:

SQL> select addr, sid, type, id1,id2,lmode, request, block from v$lock where sid in (36,37);

ADDR SID TYPE ID1 ID2 LMODE REQUEST BLOCK


37E808F0 36 AE 100 0 4 0 0

37E80ED4 37 AE 100 0 4 0 0

37E80F48 37 TX 458771 808 0 6 0

B7DE8A44 37 TM 73181 0 3 0 0

B7DE8A44 36 TM 73181 0 3 0 0

377DB5D0 36 TX 458771 808 6 0 1

6 rows selected

SQL> select * from dba_waiters;

WAITING_SESSION HOLDING_SESSION LOCK_TYPE MODE_HELD MODE_REQUESTED LOCK_ID1 LOCK_ID2


        37             36Transaction               Exclusive                               Exclusive                                   458771       808

由此,我们可以获取到结论:for update子句的默认行为就是自动启动一个事务,借助事务的锁机制将数据进行锁定。

Of子句是配合for update语句使用的一个范围说明标记。从官方的语法结构看,后面可以跟一个或者多个数据列列表。这种语法场景常常使用在进行连接查询的select中,对其中一张数据表数据进行锁定。

SQL> select empno,ename,job,mgr,sal from emp,dept where emp.deptno=dept.deptno and empno=7369 for update of emp.empno;

EMPNO ENAME JOB MGR SAL


7369 SMITH CLERK 7902 800.00

SQL> select addr, sid, type, id1,id2,lmode, request, block from v$lock where sid=36;

ADDR SID TYPE ID1 ID2 LMODE REQUEST BLOCK


37E808F0 36 AE 100 0 4 0 0

B7E1C2E8 36 TM 73181 0 3 0 0

377DBC0C 36 TX 65566 747 6 0 0

上面的语句中,我们看到使用for update of指定数据列之后,锁定的范围限制在了所在的数据表。也就是说,当我们使用连接查询配合of子句的时候,可以实现有针对性的锁定。

同样在连接查询的时候,如果没有of子句,同样采用默认的模式,会如何呢?

SQL> select empno,ename,job,mgr,sal from emp,dept where emp.deptno=dept.deptno and empno=7369 for update;

EMPNO ENAME JOB MGR SAL


7369 SMITH CLERK 7902 800.00

SQL> select addr, sid, type, id1,id2,lmode, request, block from v$lock where sid=36;

ADDR SID TYPE ID1 ID2 LMODE REQUEST BLOCK


37E808F0 36 AE 100 0 4 0 0

B7E1C2E8 36 TM 73179 0 3 0 0

B7E1C2E8 36 TM 73181 0 3 0 0

377DBC0C 36 TX 458777 805 6 0 0

SQL> select owner,object_name from dba_objects where object_id=73179;

OWNER OBJECT_NAME


SCOTT DEPT

明显可以看到,当我们没有使用of子句的时候,默认就是对所有select的数据表进行lock操作。

加锁行为子句

加锁行为子句相对比较容易理解。这里分别介绍。

Nowait子句

当我们进行for update的操作时,与普通select存在很大不同。一般select是不需要考虑数据是否被锁定,最多根据多版本一致读的特性读取之前的版本。加入for update之后,Oracle就要求启动一个新事务,尝试对数据进行加锁。如果当前已经被加锁,默认的行为必然是block等待。

使用nowait子句的作用就是避免进行等待,当发现请求加锁资源被锁定未释放的时候,直接报错返回。

///session1中

SQL> select * from emp for update;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO


7369 SMITH CLERK 79021980-12-17 800.00 20

7499 ALLEN SALESMAN 76981981-2-20 1600.00 300.00 30

7521 WARD SALESMAN 76981981-2-22 1250.00 500.00 30

7566 JONES MANAGER 78391981-4-2 2975.00 20

//变换session,进行执行。

SQL> select * from emp for update nowait;

select * from emp for update nowait

ORA-00054:资源正忙,但指定以NOWAIT方式获取资源,或者超时失效

对应的还有就是wait子句,也就是默认的for update行为。一旦发现对应资源被锁定,就等待blocking,直到资源被释放或者用户强制终止命令。

对wait子句还存在一个数据参数位,表示当出现blocking等待的时候最多等待多长时间。单位是秒级别。

//接上面的案例

SQL> select * from emp for update wait 3;

select * from emp for update wait 3

ORA-30006:资源已被占用;执行操作时出现WAIT超时

Skip locked参数

Skip locked参数是最新引入到for update语句中的一个参数。简单的说,就是在对数据行进行加锁操作时,如果发现数据行被锁定,就跳过处理。这样for update就只针对未加锁的数据行进行处理加锁。

//session1中,对一部分数据加锁;

SQL> select * from emp where rownum<4 for update;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO


7369 SMITH CLERK 79021980-12-17 800.00 20

7499 ALLEN SALESMAN 76981981-2-20 1600.00 300.00 30

7521 WARD SALESMAN 76981981-2-22 1250.00 500.00 30

//在session2中;

SQL> select * from emp for update skip locked;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO


(篇幅原因,省略)

7934 MILLER CLERK 77821982-1-23 1300.00 10

11 rows selected

总数据一共14行。Session1中,先lock住了3行数据。之后的seesion2中,由于使用的skip locked子句参数,将剩下的11条数据进行读取到并且加锁。

点赞
2

评论

分享

收藏
7

举报
关注
一键三连

数据库oracle for update of和for update的区别
11-16
数据库oracle锁: for update of和for update的区别,解释得很清楚,有很多详细例子说明。

优质评论可以帮助作者获得更高权重
表情包
相关推荐
oracle update更新语句
qq_31513339的博客
3万+
注意:oracle中update多列用逗号分隔。 1.update IOP_T_USERINFO t set (t.birthday, t.department)=(select ‘5202’,‘南京’ from dual ) where t.userid=‘321’; 2.update IOP_T_USERINFO t set t.birthday=‘5202’, t.departme…
Select For update语句浅析
ciqu9915的博客
2903
Select … for update语句是我们经常使用手工加锁语句。通常情况下,select语句是不会对数据加锁,妨碍影响其他的DML和DDL操作。同时,在多版本一致读机制的支持下,select语句也不会被其他类型语句所阻碍。…
转载—oracle锁机制之悲观锁与乐观锁以及for update用…
4-11
在操作DML(insert,update,delete)语句时,oracle会自动加上行级锁,在select * from table for update 【of column】【nowait|wait 3】时,oracle也会自动加锁 1.1 单表 for update 一般在for update 时加nowait,这样就不用等待其…
oracle 锁的应用,oracle for update 锁应用_Aviationba…
5-6
图画的比较简单,说明下吧,SERVICE1 , SERVICE2 , SERVICE3 分别为3台服务器,同时从MQ中拿到相关数据,要增加到数据库某表中,如不用for update 进行数据库表锁定(悲观锁),会出现3个线程同时检验到(check exist) 当前记录数据库表中…
SELECT语句中的for update的用法(锁的运用)
SunWuKong_Hadoop的博客
3万+
回复1:一般FOR UPDATE用在PL/SQL的游标里,它的作用就是一个行级锁(对游标里所有的记录),如果其他进程要更新这个游标行级锁里的记录,就必须等待当前进程的COMMIT或者回滚。 该语句用来锁定特定的行(如果有where子句,就是满足where条件的那些行)。当这些行被锁定后,其他会话可以选择这些行,但不能更改或删除这些行,直到该语句的事务被commit语句或rollback语句结束…
Oracle锁之行级锁
xueyy1037的博客
1万+
首先,要充分理解什么叫锁,比如网购时,你买衣服,你下单后,数据库的数量就会减少,当你购买最后一件衣服的时候,别的用户就无法再购买,相当于数据库中的表被锁定了,其他用户无法再修改,也就是两个人不能同时购买这一件衣服,如果两个人同时下单,买最后一件衣服,衣服该给谁呢?这就是锁存在的必要性。其次,咱们说说锁的优点:1,一致性 一次只允许一个用户修改2, 完整性 给所有用户提供正确数据3, 并发性 允许多…
oracle update select用法_超详细的Oracle锁机制总结_w…
5-7
8、当一行被修改后,Oracle通过回滚段提供给数据的一致性读。 Oracle锁的类型 SQL>selecttype,name from V$lock_type; TM锁和TX锁 1、TM 表锁 发生在insert,update,delete以及select for update操作时,目的是保证操 …
oracle for update 共享锁_Oracle常见的5种数据库锁机…
5-4
好了,进入正题,下面简单说说Oracle中的5中常用锁概念:行独占锁、行共享锁、表独占锁、表共享锁、表共享行独占锁。 行独占锁 这个最常见,一般我们所用的insert、update、delete语句都会隐式获取行独占锁,当然,我们也可以通过lock table…
Oracle中的锁(LOCK)机制
renfengjun
1万+
本文结合示例简要的介绍了一下Oracle中锁的机制。
浅谈Oracle锁机制表锁行锁乐观锁悲观锁
lishengko的博客
9128
  Oracle的锁机制主要分为行锁和表锁,行锁即锁定表中的某行数据,表锁锁定表中所有数据。锁定的数据不能插入,更新,删除,只能查询,语法 for update。锁的周期为一次数据提交,一次数据提交中可能会有多条SQL语句。   在大并发中为了保证某些数据的唯一性,常用到锁的机制,下文会有介绍如何在大并发下保证订单流水号的唯一性。 表锁: 线程1:select * from user for…
Oracle的For Update语句
Developer
1348
Select…for update 语句是我们经常使用手工加锁语句。通常情况下,select语句是不会对数据加锁,妨碍影响其他的DML和DDL操作。同时,在多版本一致读机制的支持下,select语句也不会被其他类型语句所妨碍。 借助for update子句,我们可以在应用程序的层面手工实现数据加锁保护操作。 加锁范围子句: 在select …for update 之后,可以
oracle锁机制之悲观锁与乐观锁以及for update用法
上善若泪
1874
目录 1 悲观锁 1.1 单表 for update 1.2关联表for update 1.3 悲观锁缺点 2乐观锁 2.1 比对法 2.2版本戳 2.3timestamp型 2.4 例子Demo 1 悲观锁 所谓的悲观锁:顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次拿数据的时候都会上锁。这样别人拿数据的时候就要等待直到锁的释放。 数据库行级…
Oracle for update锁表
Afollower的博客
152

  1. 问题发现 在查询数据库时,忘记删除之前使用for update,其他对此表操作失败并锁表。 2. 开启修改SQL语句 SELECT * FROM TABLE_NAME FOR UPDATE; //① SELECT T.* , T.ROWID FROM TABLE_NAME T; //② 3. 注意点 ① 使用for update时,会在执行时开启事务,如果不commit,事务一直在那,如果其他程序或人操作同一张表,则会造成锁表。 ② 使用T.ROWID语句在执行时不会开启事务,在修改完数据后,点击提
    Oracle锁机制深度分析
    gangma2
    3819
    Oracle锁机制深度分析一、概述二、Oracle两种锁机制三、Oracle锁类型1、 DML锁1)、TM锁2)、TX锁2、 DDL锁1)、排它的DDL锁定(Exclusive DDL Lock)2)、共享的DDL锁定(Shared DDL Lock )3)、可打破的解析锁定(Breakable Parsed Lock)3、 内部锁和闩四、悲观锁和乐观锁1、悲观封锁2、乐观封锁五、死锁1、死锁案例…
    Oracle的update语句优化研究
    9214
    Oracle的update语句优化研究 一、 update语句的语法与原理 1. 语法 单表:UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 如:update t_join_situation set join_state='1’whereyear=‘2011’ 更新年度为“2011”的数据的join_state字段为
    Oracle数据库for update锁表现象及解决方法
    Jake Weng
    4231
    一、锁表现象 用户一在PL/SQL或SQL Developer中执行如下语句: select uid, username from t_user where uid = 2 for update; 并且没有点击提交事务,那么会产生行级锁。 那么用户二再在此表下执行for update语句时,就会出现卡死现象。 二、解决方案 2.1 用户操作 让用户一提交事务,便可以解锁。 用户二为了保险起见,可…
    Oracle数据库解決因为for update未提交断掉导致锁表的问题
    q6915162的博客
    3458
    当执行例如:select * from table1 for update语句,因为网络等问题导致未提交前断掉,下一次执行相同语句时资源正忙。 解决方案:第一步:–查询锁表 select b.owner,b.object_name,a.session_id,a.locked_mode
    大唐杯资料+题库(移动通信)
    12-30
    大唐杯资料+题库(移动通信)
    SpringBoot+MyBatisPlus+Vue 前后端分离项目快速搭建【后端篇】【快速生成后端代码、封装结果集、增删改查、模糊查找】【毕设基础框架】
    『愚』的博客
    1万+
    前后端分离项目快速搭建数据库准备后端搭建1、快速创建个SpringBoot项目2、引入依赖3、编写代码快速生成代码4、运行代码生成器生成代码5、编写application.properties6、在启动类上添加@MapperScan7、编写测试代码测试数据库是否连接正确8、编写后端的工具类代码(封装结果集、日期处理、解决跨域请求)9、编写后端的增删改查代码前端搭建由于篇幅有限,前端搭建单独再写一篇 数据库准备 data_test.sql: /* SQLyog Enterprise v12.08 (64 bi
    C入门基础视频精讲
    09-28
    本课程讲述了c
    的基本语言,进阶语言,以实战为基准,高效率传递干货, 教会学员命令行编译直击底层过程,现场编码 并且掌握各种排错思路
    小程序开发全家桶
    06-13
    小程序开发零基础入门,小程序后台开发零基础入门,商城小程序开发,微信支付视频,小程序登陆注册功能学习
    python入门
    12-18


您观看课程学习后
免费入群领取【超全Python资料包+17本学习电子书】


帮助与数百万年轻人打开人工智能的学习大门!

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页 关于我们 招贤纳士 广告服务 开发助手

400-660-0108

kefu@csdn.net

在线客服
工作时间 8:30-22:00
公安备案号11010502030143
京ICP备19004658号
京网文〔2020〕1039-165号
经营性网站备案信息
北京互联网违法和不良信息举报中心
网络110报警服务
中国互联网举报中心
家长监护
Chrome商店下载
©1999-2021北京创新乐知网络技术有限公司
版权与免责声明
版权申诉
出版物许可证
营业执照

zhq200902
码龄6年
暂无认证
6
原创
32万+
周排名
19万+
总排名
5万+
访问

等级
563
积分
4
粉丝
8
获赞
0
评论
11
收藏
私信
关注
搜博主文章

热门文章
ORACLE锁机制以及For update语句 20501
oracle 每日一题-avg求平均值 5814
oracle rownum和connect by 扫盲 4629
oracle 每日一题-12c新功能:json函数 4426
oracle复合索引以及逆序索引 2751
分类专栏

javascript
2篇

oracle
19篇

java
3篇
最新文章
java转型
oracle 每日一题-数字格式化模型
oracle 每日一题-分析函数row_number
2017年24篇

举报

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论