A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 巴拉巴拉x 初级黑马   /  2018-5-27 16:20  /  518 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 小石姐姐 于 2018-5-30 15:11 编辑

MVC和事务


MVC反射
  • 一个JavaBean有且只有一个对应的Class对象(字节码对象),不管是以哪种方式获得的,都是同一个!!
  • 目的

    • 操作某个类的属性或方法
    • 用.class文件获取对象:newInstance();且获取的对象是Object类型的.
    • 用.class文件获取成员变量,构造方法,成员方法等,都是用get,
    • 获取构造方法

      • 字节码对象.getConstructor(参数1.class,参数2.class.......)

    • 获取成员方法

      • getMethod(String name,参数1数据类型.class,参数2数据类型.class...).

    • 执行成员方法

      • .invoke()-->导入的是java.lang.reflect...invoke




内省
  • 基于反射,但是只能获取get/set方法
  • 介绍

    • 内省:特定的JavaBean

  • javaBeans类

    • BeanInfo bi = 字节码对象.getBeanInfo()

  • 一个JavaBean的属性是有get/set方法来确定的(其实只是为了安全,获取了公共的get/set方法,然后给属性赋值和获取值,如果没有对应的方法则不能操作,但是真正的属性还是成员变量那,可以设置Accessible的值为true,然后就可以操作没有get/set方法的属性)

写工具类
  • 动态代理和反射结合使用,通用性更高.

事务
  • Connection对象的方法

    • 开启事务

      • JDBC设置自动提交为false

        • setAutoCommit(false);



  • Mysql 事务管理有两种方式:

    • 手动开启事务

      • start transaction
      • 多条sql语句
      • commit/rollback

    • 设置一个自动提交的参数为off(Mysql数据库事务默认是自动提交的,而Oracle 数据库事务默认是不自动提交的.)

      • show variables like '%commit%':查看是否是自动提交事务.
      • set autocommit = 0;

        • 0和off同等
        • 1和on 同等


    • 如果事务语句比较多,就用下边这个方式,设置自动提交为关闭状态,写完一组逻辑单元就提交一次,然后再继续写下一组逻辑单元,如果事务语句很少,就用上边的方法,只要提交或者回滚,自动提交就又会开启,

  • 事务管理的核心思想

    • 保证Dao的Connection对象是同一个,

      • DBUtils是采用的向下传递的方式,保证是同一Connection对象
      • 有一个框架是采用的绑定本地线程的方法,即把一个连接绑定到当前线程上(通过ThreadLocal类),谁用谁去里边取,


  • ThreadLocal类,

    • 一个Servlet就是一个线程,可以把一个连接绑定到一个线程上
    • 类中有个方法:

      • set()-->绑定
      • get()-->获取



小总结事务
  • 逻辑上的一组操作,是&的关系,只要有一个失败就全部失败
  • 事务的特性:ACID

    • 原子性

      • 事务的不可分割

    • 一致性

      • 事务执行前后,数据的完整性要保持一致

    • 隔离性

      • 一个事务的执行,不应该受到其他事务的干扰

    • 持久性

      • 事务一旦结束(提交或者回滚),数据就持久保持到了数据库.


  • 如果不考虑事务的隔离性,就会引发一些安全性的问题,

    • 一类是读的问题

      • 脏读

        • 读到了未提交的数据(即读到了还没有持久性保存的数据)

      • 不可重复读

        • 一个事务读到了另一个事务已经提交的update的数据,导致在当前的事务中多次查询结果不一致

      • 虚读/幻读

        • 一个事务读到了另一个事务已经提交的insert的数据,导致在当前的事务中多次查询的结果不一致


    • 一类是写的问题

      • 引发两类丢失更新.


  • 如何解决那三种读的问题

    • 设置事务的隔离级别

      • read uncommitted:未提交读,->脏读,不可重复读,幻读都有可能发生.
      • read committed:已提交读--->避免脏读,但是不可重复读和幻读有可能发生
      • repeatable read:可重复读-->可以避免脏读,不可重复读,有可能发生幻读
      • serializable:串行化:三种问题都可以避免

    • Connection类中有方法设置隔离级别

      • setTransactionIsolation(int level)

        • int level可以用字段来代替
        • 就是隔离级别的全部大写,单词之间用_分开
        • conn.setTransactionIsolation(TRANSACTION_READ_UNCOMMITTED)
        • conn.setTransactionIsoation(TRANSACTION_READ_COMMITTED)
        • conn.setTransactionIsolation(TRANSACTION_REPEATABLE_READ)
        • conn.setTransactionIsolation(TRANSACTION_SERIALIZABLE)


    • 设置的隔离级别都是当前事务的隔离级别,不影响其他事务的级别.

  • 在DOS窗口设置隔离级别的命令

    • set session transaction isolation level serializable:设置事务隔离级别为最高级别-->serializable
    • select @@tx_isolation:查看当前事务的隔离级别.
    • start transaction:开启事务



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马