JPA总结4

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

猜你喜欢

转载自blog.csdn.net/weixin_44671176/article/details/97697011