21.9.16所学总结

共享锁和排他锁

共享锁又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。
排他锁又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。
他们都是行级锁

1、锁的分类

1.1从对数据操作的类型来分
    读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响。    
      结论1:
      --如果某一个会话 对A表加了read锁,则 该会话 可以对A表进行读操作、不能进行写操作; 且 该会话不能对其他表进行读、写操作。
      --即如果给A表加了读锁,则当前会话只能对A表进行读操作。
      结论2:
      会话0给A表加了锁;其他会话的操作:a.可以对其他表(A表以外的表)进行读、写操作
      b.对A表:读-可以; 写-需要等待释放锁。、
      某回话给某个表加了读锁,所有的回话都能对该表进行读操作,不能进行写操作,除非该会话释放读锁。
    写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁。    
      当前会话(会话0) 可以对加了写锁的表 进行任何操作(增删改查);但是不能 操作(增删改查)其他表
      其他会话:对会话0中加写锁的表 可以进行增删改查的前提是:等待会话0释放写锁

从锁粒度划分。

一般分为:行锁、表锁、库锁
(1)行锁:访问数据库的时候,锁定整个行数据,防止并发错误。 如InnoDB存储引擎使用行锁
(2)表锁:访问数据库的时候,锁定整个表数据,防止并发错误。 如MyISAM存储引擎使用表锁
行锁 和 表锁 的区别:
表锁: 开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突概率高,并发度最低
行锁: 开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高

补充 悲观锁 和 乐观锁

(1)悲观锁:顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
(2)乐观锁: 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。
(3)悲观锁 和 乐观锁的区别:
乐观锁在不发生取锁失败的情况下开销比悲观锁小,但是一旦发生失败回滚开销则比较大,因此适合用在取锁失败概率比较小的场景,可以提升系统并发性能
乐观锁还适用于一些比较特殊的场景,例如在业务操作过程中无法和数据库保持连接等悲观锁无法适用的地方
小结:
MySQL5.5 版本以前默认引擎是MyISAM行级锁的锁模式
5.5以后默认引擎是InnoDB表级锁的锁模式
MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,
在执行更新操作(DML)前,会自动给涉及的表加写锁。
所以对MyISAM表进行操作,会有以下情况:
a、对MyISAM表的读操作(加读锁),不会阻塞其他进程(会话)对同一表的读请求,
但会阻塞对同一表的写请求。只有当读锁释放后,才会执行其它进程的写操作。
b、对MyISAM表的写操作(加写锁),会阻塞其他进程(会话)对同一表的读和写操作,
只有当写锁释放后,才会执行其它进程的读写操作。

el表达式

  • 用来获取数据
  • 执行运算
  • 获取web开发常用的对象,如参数
jsp标签
<jsp:include page="common/head.jsp"/> //公共页面
<jsp:forward page="jsptag2.jsp"> //请求转发
    <jsp:param name="name" value="freak"/>//设置参数
    <jsp:param name="age" value="123"/>
</jsp:forward>
JSTL表达式

JSTL标签库的使用就是为了弥补HTML标签的不足,他自定义了许多的标签,这些标签可以供我们使用,标签的功能和Java代码一样

格式化标签

SQL标签

XML标签

核心标签(掌握部分)
使用步骤

  1. 引入对应的taglib
  2. 使用其中的方法
  3. 值得注意的是在tomcat中依然需要引入jstl包,否则会报错------jstl解析错误
if判断
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h4>if 测试</h4>
<form action="coreif.jsp" method="get" >
    <%--el表达式获取表单中数据${param.参数名}--%>
    <input type="text" name="username" value="${param.username}">
    <input type="submit" value="登录">
</form>
<%--判断提交的用户名是管理员就提交成功--%>
<%--<%if(request.getParameter("username").equals("admin")){--%>
<%--    out.println("登陆成功");--%>
<%--}%>--%>
<%--内部有三个参数,test必须写,判断条件,--%>
<c:if test="${param.username=='admin'}" var="isadmin" >
    <c:out value="管理员欢迎你"></c:out>
</c:if>
<c:out value="${isadmin}"></c:out>
</body>
</html>

el表达式获取表单中数据${param.参数名}
if标签内部有三个参数,test必须写,判断条件,var 是定义接收他返回值(boolean)的变量名还有一个是作用域

swith分支判断
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--定义一个变量score,值为85--%>
<c:set var="score" value="85"/>
<c:choose>
    <c:when test="${score>=90}">优秀</c:when>
    <c:when test="${score>=80}">良好</c:when>
    <c:when test="${score>=70}">还行</c:when>
    <c:when test="${score>=60}">及格</c:when>
</c:choose>
</body>
</html>

foreach循环使用
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    ArrayList<String> people = new ArrayList();
    people.add(0,"张1");
    people.add(1,"张2");
    people.add(2,"张3");
    people.add(3,"张4");
    people.add(4,"张5");
    request.setAttribute("list",people);
%>
<c:forEach var="people" items="${list}">
    <c:out value="${people}"/><br>
</c:forEach>
<hr>
<c:forEach begin="1" step="2" var="people" items="${list}">
    <c:out value="${people}"/><br>
</c:forEach>
</body>
</html>
foreach标签中的属性

var 每一次遍历出来的变量
items,要遍历的对象
begin 开始位置
end 结束位置
step 步长 就是for循环中i++他的步长是1,i+=2就是步长为2

JavaBean

java就相当于对应数据库的实体类,就比如当初使用jdbc编写银行管理系统创建了一个coustorm的实体类,对用数据库中的表
ORM:对象关系映射

  • 表–》类 people表对应people类
  • 字段–》属性 String name对应name
  • 行记录–》对象 第一行就相当于实例化一个对象
  • jsp中new对象的方法
<body>
<% // 下面等价于
   // people p=new people()
   //people.setId()
%>
<jsp:useBean id="people" class="com.freak.entity.people" scope="page"/>
<jsp:setProperty name="people" property="id" value="1"/>
<jsp:setProperty name="people" property="name" value="张三"/>
<jsp:setProperty name="people" property="age" value="15"/>
<jsp:setProperty name="people" property="address" value="山西"/>
<%--//这个相当于people.getId()--%>
id:<jsp:getProperty name="people" property="id"/>
姓名:<jsp:getProperty name="people" property="name"/>
年龄:<jsp:getProperty name="people" property="age"/>
地址:<jsp:getProperty name="people" property="address"/>
</body>
</html>

建议使用上面的,只是因为更熟悉Java

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值