JavaWeb基础知识day13——MVC思想&&MySQL事务与Java事务

MVC

MVC思想概述

MVC:
    就是将业务逻辑,代码,显示相分离的一种思想
    M:model 模型 作用:主要是封装数据,封装对数据的访问
    V:view     视图 作用:主要是用来展示数据 一般是jsp担任的
    C:controller    控制 作用:接受请求,找到相应的javabean完成业务逻辑

在Java项目中的体现:

分层:javaee的三层架构
web
    作用:
        展示数据 ----jsp
            
        -----servlet-------
        接受请求
        找到对应的service,调用方法 完成逻辑操作
        信息生成或者页面跳转
service 业务层
    作用:
        完成业务操作
        调用dao
dao(data access object 数据访问对象)
    作用:
        对数据库的curd操作



事务

事务概述:

    就是一件完整的事情,包含多个操作单元,这些操作要么全部成功,要么全部失败.
    例如:转账
        包含转出操作和转入操作.

mysql中的事务:

    mysql中事务默认是自动提交,一条sql语句就是一个事务.
    开启手动事务方式
        方式1:关闭自动事务.(了解)
            set autocommit = off;
        方式2:手动开启一个事务.(理解)
            start transaction;-- 开启一个事务
            commit;-- 事务提交
            rollback;-- 事务回滚
    扩展:
        oracle中事务默认是手动的,必须手动提交才可以.    

java中的事务:

        Connection接口的api:★
            setAutoCommit(false);//手动开启事务
            commit():事务提交
            rollback():事务回滚
        
        扩展:了解 Savepoint还原点
            void rollback(Savepoint savepoint) :还原到那个还原点
            Savepoint setSavepoint() :设置还原点

Connection事务处置

例如:转账
        一旦出现异常,钱飞了.
要想避免这事情,必须添加事务,在service添加事务.
为了保证所有的操作在一个事务中,必须保证使用的是同一个连接
在service层我们获取了连接,开启了事务.如何dao层使用此连接呢????
    方法1:
        向下传递Connection参数.注意连接应该在service释放
    方法2:
        可以将connection对象绑定当前线程上
        jdk中有一个ThreadLocal类,
        ThreadLocal 实例通常是类中的 private static 字段,
        它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联。 
ThreadLocal的方法:
    构造:
        new ThreadLocal()
    set(Object value):将内容和当前线程绑定
    Object get():获取和当前线程绑定的内容
    remove():将当前线程和内容解绑
内部维护了map集合
    map.put(当前线程,内容);
    map.get(当前线程)
    map.remove(当前线程)

事务总结:

事务的特性:★★★【面试题】
    ACID【Atomicity、Consistency、Isolation、Durability】
    原子性:事务里面的操作单元不可切割,要么全部成功,要么全部失败
    一致性:事务执行前后,业务状态和其他业务状态保持一致.
    隔离性:一个事务执行的时候最好不要受到其他事务的影响
    持久性:一旦事务提交或者回滚.这个状态都要持久化到数据库中
不考虑隔离性会出现的读问题★★
    脏读:            在一个事务中,读取到另一个事务没有提交的数据
    不可重复读:        在一个事务中,两次查询的结果不一致(针对的update操作)
    虚读(幻读):        在一个事务中,两次查询的结果不一致(针对的insert操作)
通过设置数据库的隔离级别来避免上面的问题(理解)
read uncommitted      读未提交    上面的三个问题都会出现
read committed      读已提交    可以避免脏读的发生
repeatable read    可重复读    可以避免脏读和不可重复读的发生
serializable        串行化        可以避免所有的问题    
四种隔离级别的效率
    read uncommitted>read committed>repeatable read>serializable
四种隔离级别的安全性
    read uncommitted 开发中绝对不允许脏读发生.
  mysql中默认级别:repeatable read
  oracle中默认级别:read committed

你可能感兴趣的:(java基础,Java开发,JavaWeb,MySQL)