E-R图(数据库工具生成的关系图)
E-R图也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型、属性和联系的方法,用来描述现实世界的概念模型
jpql
jpql:jpa 持久化的查询语言,它和sql是类似,但是还是有区别
jpql规范写法:
(1) jpql 不能出现*号,必须出现对象的别名和属性名区分大小写
(2)jpql的关键字和sql一样,不分区大小写
3.分页查询
sql里面怎么分页:
select * from t_table limit beginIndex,pageSize
beginIndex:开始位置
pageSize:每页显示的条数
beginIndex = (currentPage-1)*pageSize;
4 事务并发(概念)
4.1 什么叫事务
一组操作 要么都成功 要么都失败
4.2 事务特性
ACID
原子性: 事务这个单元它已经是最小单元,不能在去分割
一致性 : 数据一致性,操作之前,如果金额是10000,操作完之后,金额也应该是10000
隔离性 : 事务和事务之间,他们是相互隔离的,你的事务,不能操作我的事务,不然出现事务并发
持久性 :当前事务commit的时候,就把数据永久存储下来;
4.3事务并发
事务并发:有多个事务同时操作同一个数据的时候,就会出现事务并发问题
4.4事务并发带来的问题
事务并发:
第一类丢失更新 ,第二类丢失更新。第一类丢失更新和第二类丢失更新,现象是差不多
第一类丢失更新:一个人投一票,另外一个人又撤销 – 投的票丢失
第二类丢失更新:明明两个人都投了一票,但是只有一票有效
-----------程序可以处理第一类丢失更新和第二类丢失更新
脏读
1.张三的原工资为4000, 财务人员将张三的工资改为了8000(但未提交事务)
2.张三读取自己的工资 ,发现自己的工资变为了8000,欢天喜地!(在缓存中读取)
3.而财务发现操作有误,回滚了事务,张三的工资又变为了4000 像这样,张三记取的工资数8000是一个脏数据。
指一个线程中的事务读取到了另外一个线程中未提交的数据。
解决办法:如果在第一个事务提交前,任何其他事务不可读取其修改过的值,则可以避免该问题。
虚读
指一个线程中的事务读取到了另外一个线程中提交的update的数据。
幻读
指一个线程中的事务读取到了另外一个线程中提交的insert的数据。
目前工资为4000的员工有10人。
1.事务1,读取所有工资为4000的员工。
2.这时事务2向employee表插入了一条员工记录,工资也为4000
3.事务1再次读取所有工资为4000的员工共读取到了11条记录,
解决办法:如果在操作事务完成数据处理之前,任何其他事务都不可以添加新数据,则可避免该问题。
不可重复读
-------- 脏读 虚读 不可重复 交给数据库处理,数据库事务隔离级别–数据库管理员dba (运维范畴)
(oracle dba 2000$ 培训还–会计师)
------ 一般不建议你去修改隔离级别 除非你是数据库dba
4.5 数据库隔离级别
READ UNCOMMITTED(读未提交) 幻想读(虚读)、不可重复读和脏读都允许。
READ COMMITTED 允许幻想读,不可重复读,不允许脏读
REPEATABLE READ(repeatable) 允许幻想读,不允许不可重复读和脏读
SERIALIZABLE 幻想读、不可重复读和脏读都不允许
4.6 第一类丢失更新和第二类丢失更新
第一类丢失更新
库存是1件
当事务A和事务B同时修改某行的值,
1.事务A将数值改为0并提交,购买了一件
2.事务B将数值改为0并提交,也购买了一件。这时数据的值为0,事务A所做的更新将会丢失。(相当于就卖出去2件商品)
解决办法:对行加锁,只允许并发一个更新事务。(JPA中的悲观锁,乐观锁)
第二类丢失更新
多个事务同时读取相同数据,并完成各自的事务提交,导致最后一个事务提交会覆盖前面所有事务对数据的改变
悲观锁: Lock 一般不用
相当于同步效果, 如果一个人操作数据的时候,先把数据锁住,另外一个人必须等待我操作完,释放锁之后,才能进行操作
弊端:如果效率很低
底层: 可以锁行
transaction;
begin:
select * from t_employee where id=1 for update;
…
update t_employee set money =money+1000;
commit;
乐观锁:
乐观锁 不会锁数据,通过版本号机制
如何优化JPA
经验:
-
使用双向一对多关联,不使用单向一对多–效率高一点
-
灵活使用单向多对一关联 --多方来维护效率高一点
-
不用一对一,用多对一取代(不要使用共享主键一对一,使用唯一外键一对一)
-
配置对象二级缓存(配置 Cacheable),查询缓存(jpql查询),没有查询条件才使用查询缓存(如果有条件命中是很低)
-
组合关系集合使用list(顺序,重复)–第二个项目 单据模块,多对多集合使用set
-
表字段要少,表关联不要怕多,有二级缓存撑腰,设计表尽量达到第三范式(外键)
JPA难在什么地方 -> 细节(练,思考)太多了,性能太难控制了(经验)