1.事务:表示一组操作要么都成功,有一个失败,所有操作都会失败。


在mysql要使用事务,就要先开启事务,语句start transaction,提交事务:commit 回滚事务:rollback。


转账:


2.jdbc事务的操作


    (1)操作事务的方法


    setAutoCommit(boolean autoCommit) 设置事务的提交方式,默认自动提交,设置为fals不会提交


    提交事务commit()


    回滚事务rollback()


    使用jdbc来完成转账


    小金跟小李接一千


    (2)设置事务的回滚点


        回滚的时候还要提交,commit(sq);会回到设置回滚点的地方


3.事务的特性:


1.原子性:在事务里面操作,要么成功,要么都失败 


              2.一致性:在事务操作过程中,数据要保持一致性,比如钱不会多,也不会少


              3.隔离性:多个事务同时对一张表操作,多个事务不会互相影响


              4.持久性:提交事务到数据库,是真正生效


4.事务的隔离性


  不考虑事务的隔离性,产生一些问题,五个问题


    三个读对的问题:第一个问题:脏读,一个事务获取到另外事务的没有提交的事务


                    第二个问题:不可重复读,一个事务里面查询到已经提交的事务,另外一个事务里面是update,导致两个事务查询到的数据是不一样的。


                    第三个问题:虚读:一个事务里面查询到另外一个事务里面insert操作


    解决方式:通过隔离级别解决这些读的问题


 Serializable:串行的.避免脏读、不可重复读和虚读发生   


 Repeatable read:重复读. 避免脏读、不可重复读.但是虚读还是有可能发生的,默认是这个,两个事务都需要提交了,才能查询到


Read committed:已提交读.避免脏读.但是不可重复读和虚读有可能发生,提交的时候,才能查询到钱,避免了损失。 导致两个事务查询到的数据是不一样的


 Read uncommitted:未提交读.脏读、不可重复读、虚读都可能发生 没有提交就可以查询到内容,如果回滚的话,就会查不到钱。


     


    select @@tx_isolation;  查询当前事务隔离级别


    set session transaction isolation level  设置事务隔离级别


    (1)演示脏读


        第一步:打开两个cmd窗口


        第二步:设置隔离级别


        第三步:开启事务


        第四步:在左边查看数据


         Read committed:在左边窗口通过食物查看数据,这两次看得结果不一样,


        多个事务之间互相印象,不可重复读


5.mysql数据库的备份和还原


    第一种:使用可视化工具进行备份


    第二种:使用sql语句


    mysqldump -u root -p  要备份的数据名称>要放的磁盘   


    通过这个语句备份的数据库语句里面,没有创建数据库的语句


    注意1:不能连接数据库


没有创建数据库的语句


    注意3:备份文件要以.sql为后缀名


    注意4:备份路径不能有中文


    mysqldump -u root -p day16 >d:\day17.sql


    还原数据库


    mysql -u root -p 要还原的数据库<备份的文件路径


    注意1:执行的语句后面不能写分号


    注意2:不要登录


 6.连接池的概述


    之前得到数据库连接DriverManager.getConnection();


    每个用户连接都需要执行一次,运用连接池来解决


    预先创建一些连接,放到内存中的一个空间,每次访问的时候,从内存空间里面获取一个链接,用完之后不进行关闭,放回内存空间里面,供其它用户使用。避免频繁的创建和关闭在内存空间理解为,一个容器,容器里面放着数据库的连接。


    自定义连接池(了解)


    


 创建一个类实现一个接口DataSource


    在内存中分配一个空间List集合,把创建的多个连接放到集合里面


    把创建的连接放到集合里面去   add()


    把链接取出来,remove(0) 



    开源的连接池


 DBCP连接池


    C3P0连接池(一般企业中的都使用这个连接池)


    Tomcat内置的连接池



如何增强一个类的方法


    第一种继承

  public class TestMethod {
    public static void main(String[] args) {
    Man m=new SuperMan();
    m.run1();     
    }
    }
    class Man{
    public void run1(){
    System.out.println("nam run");
    }
    }
    class SuperMan extends Man {
    public void run1(){
    //super.run1();
    System.out.println("supernam run");
    }
    }

    第二种装饰者模式


        首先创建一个接口,在接口里面定义一个方法


        写两个类,这两个类分别实现这个接口


        在增强的方法所在类里面,得到增强方法所在类的引用

public class TestMethod2 {
    public static void main(String[] args) {
    Diao d=new Diao(new Ying());
    d.fly();
    }     
    }
    interface Bird{
    public void fly();
    }
    class Ying implements Bird{
    public void fly() {
    // TODO Auto-generated method stub
    System.out.println(1000);
    }
    }
    class Diao implements Bird{
    private Bird bird;
    public Diao(Bird bird){
    this.bird=bird;      
    }
    public void fly() {
    // TODO Auto-generated method stub
    bird.fly();
    System.out.println(0);
    }     
    }


    第三种动态代理


9.开源连接池


 DBCP连接池:Apache软件组织,开源的连接池,首先导入jar包


BasicDataSource :手动配置文件方式


 BasicDataSourceFactory:自动配置文件,配置文件的名称是固定的不能改变


    C3p0连接池


        想要使用c3p0连接池,的jar包


 ComboPooledDataSource 


        第一种手动进行配置,创建类

   

combo.setDriverClass("com.mysql.jdbc.Driver"); 
 
          combo.setJdbcUrl("jdbc:mysql:///day18"); 
 
          combo.setUser("root"); 
 

          combo.setPassword("root");


        第二种配置


        创建一个配置文件,不是properties格式,是xml配置文件


 注意1:xml的名称是固定c3p0-config.xml.,注意2:配置文件要放在src下面,不能放在其他下面,

ComboPooledDataSource("")不写或则写错,找默认读取defalut-config 里面的信息,

    tomcat内置连接池

        使用的jndi技术,需要在tomcat里面进行

        有一个类,想要调用这个类,给类起一个名称,通过起这个名字访问类

        * 步骤


        第一步: 创建一个配置文件,名字固定context.xml

        这个文件需要创建在可以有三个地方

        第一个可以把文件创建在conf目录下面: 在tomcat里面所有的虚拟主机都可以使用

        第二个可以把文件创建\conf\Catalina\localhost:只能在当前的虚拟主机里面使用


        第二步:创建servlet实现连接池

        由于tomcat内置的连接池,必须要运行在tomcat里面才可以使用这个连接池