1.jpql(掌握)
jpql:jpa 持久化的查询语言,它和sql是类似,但是还是有区别。
jpql规范写法:
(1) jpql 不能出现*号,必须出现对象的别名和属性名区分大小写。
(2)jpql的关键字和sql一样,不分区大小写。
jpql写法:
select o
from Employee o
where o.属性名
group by
order by
having
2.jpql的练习(掌握)
(1)基本的查询
(2)distinct
(3)集合操作size
(4)聚集函数
(5)join操作 join / left join
(6)子查询
(7)原生sql: __ creatNativeQuery( sql , XXX.class )__
3.分页查询
sql里面怎么分页:
select * from t_table limit beginIndex,pageSize
beginIndex:开始位置
pageSize:每页显示的条数
beginIndex = (currentPage-1)*pageSize;
4 事务并发(概念)
原子性(atomic),事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行
一致性(consistent),事务在完成时,必须使所有的数据都保持一致状态。
隔离性(insulation),由事务并发所作的修改必须与任何其它并发事务所作的修改隔离。
持久性(Duration),事务完成之后,它对于系统的影响是永久性的。
4.1 什么叫事务
一组操作 要么都成功 要么都失败 。
4.2 事务特性
ACID:
原子性: 事务这个单元它已经是最小单元,不能在去分割
一致性 : 数据一致性,操作之前,如果金额是10000,操作完之后,金额也应该是10000
隔离性 : 事务和事务之间,他们是相互隔离的,你的事务,不能操作我的事务,不然出现事务并发
持久性 :当前事务commit的时候,就把数据永久存储下来;
4.3事务并发
事务并发:有多个事务同时操作同一个数据的时候,就会出现事务并发问题
4.4事务并发带来的问题
1、事务并发:
第一类丢失更新 ,第二类丢失更新。第一类丢失更新和第二类丢失更新,现象是差不多。
(1) 第一类丢失更新:一个人投一票,另外一个人又撤销 – 投的票丢失。
(2) 第二类丢失更新:明明两个人都投了一票,但是只有一票有效 。
---------------------------------------程序可以处理 第一类丢失更新 和 第二类丢失更新
(3) 脏读 :
1.张三的原工资为4000, 财务人员将张三的工资改为了8000(但未提交事务)
2.张三读取自己的工资 ,发现自己的工资变为了8000,欢天喜地!(在缓存中读取)
3.而财务发现操作有误,回滚了事务,张三的工资又变为了4000 像这样,张三记取的工资数8000是一个脏数据。
(4) 虚读(幻读) :
目前工资为4000的员工有10人。
1.事务1,读取所有工资为4000的员工。
2.这时事务2向employee表插入了一条员工记录,工资也为4000
3.事务1再次读取所有工资为4000的员工共读取到了11条记录,
(5)不可重复读 :
在一个事务中前后两次读取的结果并不致,导致了不可重复读。
1.在事务1中,Mary 读取了自己的工资为1000,操作并没有完成
2.在事务2中,这时财务人员修改了Mary的工资为2000,并提交了事务.
3.在事务1中,Mary 再次读取自己的工资时,工资变为了2000
---------------------------- 脏读 虚读 不可重复读 交给数据库处理,数据库事务隔离级别–数据库管理员dba (运维范畴)
__ 一般不建议去修改隔离级别 除非是数据库dba __
4.5 数据库隔离级别
READ UNCOMMITTED(读未提交) 幻想读(虚读)、不可重复读和脏读都允许。
READ COMMITTED 允许幻想读,不可重复读,不允许脏读
REPEATABLE READ(repeatable) 允许幻想读,不允许不可重复读和脏读
SERIALIZABLE 幻想读、不可重复读和脏读都不允许
4.6 第一类丢失更新和第二类丢失更新
1、悲观锁: Lock
相当于同步效果, 如果一个人操作数据的时候,先把数据锁住,另外一个人必须等待我操作完,释放锁之后,才能进行操作
弊端:如果效率很低
底层: 可以锁行
transaction;
begin:
select * from t_employee where id=1 ==for update==;
.......................
update t_employee set money =money+1000;
commit;
注:开发不用
2、乐观锁:
乐观锁 不会锁数据,通过版本号机制 version
版本机制:通过设置版本,先查后确认。
select number_1,version_1 from table;
update table set number=number_1+1,version=version_1+1 where version=version_1;
注:开发一般也不用
3、实际开发:消息队列 MQ