DQL:
模糊:like
News title 标题
查询标题带有:程序员 的所有新闻
Select * from news where title like ‘%程序员%’;
%: 0到多个字符
_:匹配一个字符
分页 limit
每页显示 4条 ,查询第3页
startPage=(nowPage-1)*pageSize;
Select * from news limit 8,3;
每页显示6条,查询4页
Select * from news limit 18,6;
求总的页数
已经数据库139条数据,每页显示6条
139%6==0?139/6:139/6+1;
sql语句 既要分页查询,分组查询,排序
Select *from 表名 where ……group by……having ……order by ……limit ……;
完整性约束:
实体(记录)完整性约束
主键
域(字段)完整性约束
数据类型约束
Not null
Unique
引用完整性约束:
外键约束
Oracle—》检查约束
三种:
第二种-联合主键
Create table a(
Sid int ,cid int,
Constraint pk_scid primary key(sid,cid)
);
Alter table 表名 add constraint pk_id primary key (id);
-
外键
-
classes id
-
stu sid cid
Alter table stu add constraint fk_cid foreign key(cid) references classes(id);
一、事务
1.1 事务概念
事务(transaction)是数据库管理系统的执行单位,可以是一个数据库操作(如Select操作)或者是一组操作序列。
-
mysql引擎支持事务的
-
mysql默认自动提交事务。
-
每条语句都处在单独的事务中。
mysql中手动控制事务
开启事务:start transaction ;
Begin;
提交事务:commit
回滚事务:rollback
1.2 事物的特征(ACID )
原子性(Atomicity):指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
Account:
A
B
a用户给b用户转钱
涉及到几个sql语句:
Update account set money=money-100 where name=’a’;
Update acount set money=money+100 were name=’b’;
一致性(Consistency):事务必须使数据库从一个一致性状态变换到另外一个一致性状态。转账前和转账后的总金额不变。
A 10000
B 10000
A–>B 转100
A: 9900
B:10100
隔离性(Isolation):事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
A—B
B—C:
持久性(Durability):指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
A— B–》100
二、事务控制的必要性
多线程访问数据库时 ,发生以下情况:
1、脏读(Dirty Reads)
一个事务开始读取了某行数据,但是另外一个事务已经更新了此数据但没有能够及时提交。这是相当危险的,因为很可能所有的操作都被回滚。
2、非重复读(Non-repeatable Reads)
一个事务对同一行数据重复读取两次,但是却得到了不同的结果。同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生非重复读。 (update)
3、幻像读(Phantom Reads) (虚读)
事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查
询中未出现的数据(这里并不要求两次查询的SQL语句相同)。这是因为在两次查询过程中有另外一个事务插入数据造成的。( Insert)
三、事务的隔离级别
数据库通过设置事务的隔离级别防止以上情况的发生:
1、READ UNCOMMITTED: 赃读、不可重复读、虚读都有可能发生。
2、READ COMMITTED: 避免赃读。不可重复读、虚读都有可能发生。(oracle默认的)
3、REPEATABLE READ:避免赃读、不可重复读。虚读有可能发生。(mysql默认)
4、SERIALIZABLE: 避免赃读、不可重复读、虚读。
级别越高,性能越低,数据越安全
mysql中:
查看当前的事务隔离级别:SELECT @@TX_ISOLATION;
更改当前的事务隔离级别:SET TRANSACTION ISOLATION LEVEL 四个级别之一。
设置隔离级别必须在事务之前
演示事物的隔离级别不同,发生的问题不一样:
操作 | 线程1 | 线程2 | 描述 |
---|---|---|---|
操作1 | 设置隔离级别为 Read uncommitted; Begin; Select * from account; | ||
操作2 | Begin; Update account set money=money-100 where name=’张三’; | ||
操作3 | Select * from account; 读取:张三 money:9900 | 说明:发生脏读,读取到线程2未提交的数据 | |
操作4 | Rollback; | ||
操作5 | Select * from account; 读取:张三–》10000 | 说明:发生不可重复读,第一次查询跟第二次查询的结果不一样。 | |
操作6 | Commit; Insert into account values(3,10000,’隔壁老宋’); | ||
操作7 | Select * from account; 查询出2条 查询出3条 虚读(幻读,幻象读) | 说明:发生了虚读,线程一在同一个事务下读取到了线程2自动提交事物的数据。 |
不同的隔离级别导致的问题:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-orACz7sw-1604366506447)(file:///C:/Users/13586/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png)]隔离级别 问题 | 脏读 | 不可重复读 | 虚读 |
---|---|---|---|
Read uncommitted | Yes | Yes | Yes |
Read commited | No | Yes | Yes |
Repeatable read | No | No | Yes |
Serializable | No | No | No |