数据库原理

2021/06/01 DB/JDBC/事务 共 2336 字,约 7 分钟
闷骚的程序员

1. 数据库

数据库是一个庞大的服务器软件,用来管理数据。

2. JDBC连接数据库的步骤

  • 加载数据库驱动
  • 建立数据库连接Connection对象
  • 通过Connection对象创建Statement或者PreparedStatement对象
  • 执行sql语句
  • 处理查询结果集
  • 关闭statement、数据库连接等,以释放资源

3. JDBC操作数据库原理

JDBC是java访问dataBase的一套API。它操作数据库的原理简单理解如下:

  1. jdbc和数据库建立连接。请注意,一个连接管理多个sql命令。默认情况下(自动提交事务),一个连接只会发送一个sql命令,执行完毕,提交事务;再来命令,重新建立连接,执行完毕,提交事务。
  2. 建立连接之后,通过该连接对象向数据库发送sql命令,注意,在创建的同一个连接里可以发送多条sql命令。
  3. jdbc每向数据库发送一次sql命令,就相当于和数据库建立了一次交互,默认情况下,数据库需要读取该命令,解析该命令,然后执行该命令,最后释放该命令。也就是说,数据库从接收jdbc提交的一次sql命令后,需要做很多事情最终执行这条命令。所以说,数据库接收一条sql命令本身是比较消耗性能的。
  4. 默认情况下,不考虑数据库事务隔离级别的话(即默认事务与事务之间是严格隔离的情况下),数据库接收到jdbc发送的所有sql命令,每一条sql命令都默认是一个事务,5条sql命令就分别是5个事务。
    所有的命令在数据库中执行,都在数据库内存中检查对应的数据是否存在,如果存在,则直接操作;如果不存在,再从db中重新加载。
    

    解释4:

    默认情况指的是:数据库的默认事务即一条sql默认是一个事务;并且不考虑数据库的事务隔离级别(即所有事务之间严格隔离,完全独立,A事务必须等B事务执行完毕才可以执行)。
    jdbc向数据库发送了如下SQL:
    delete from test_table;
    insert into test_table;
    update test_table;
    select from test_table;
    在数据库服务器的执行如下:
    开启事务;
    执行delete from test_table;
    从db中加载test_table的数据到数db内存;
    提交事务;
    开启事务;
    执行insert into test_table;
    先从db内存中查询test_table的数据是否存在,因为上一步已经提交了事务,上一步db内存中的数据已经释放,所以会重新从db中加载test_table到内存;
    提交事务;
    开启事务;
    执行update test_table;
    先从db内存中查询test_table的数据是否存在,因为上一步已经提交了事务,上一步db内存中的数据已经释放,所以会重新从db中加载test_table到内存;
    提交事务;
    开启事务;
    执行select from test_table;
    先从db内存中查询test_table的数据是否存在,因为上一步已经提交了事务,上一步db内存中的数据已经释放,所以会重新从db中加载test_table到内存;
    提交事务;
    
  5. 如果不显式设置事务的话,则数据库默认接收到一条sql命令,就默认开启一个事务,执行完毕后,结束事务。如果数据库同时接收多条sql命令,则默认每一条sql命令都独占一个数据库事务,多条sql命令将分别在各自的事务中执行,执行完毕后自动提交(所以说,JDBC默认执行SQL的规则是:一条命令是一个事务,一条命令和数据库进行一次交互 )。
  6. 如果显式设置了事务,则在同一个事务中的所有sql命令都按照顺序分别和数据库进行交互,相当于每一个SQL命令都和数据库交互一次(这个和默认情况是一致的),但是,因为是在同一个事务中,所以多次交互遵循一个原则:如果db内存中有数据,则直接使用;否则,再重新从数据表中加载到db内存中使用。
    解释5:
    默认情况下:
    update table;jdbc发送这条命令和数据库完成一次交互,将table的数据加载到db的内存中,交互完成后,jdbc提交事务,将数据持久化到数据库表中。
    如果再有update table;则jdbc重新和数据库完成一次交互,重新从数据库中读取table加载到内存中,交互完成后,jdbc提交事务,然后将数据持久化到数据表中。
    手动控制事务的情况下:
    开启事务;
    update table;jdbc发送这条命令和数据库完成一次交互,将table的数据加载到db的内存中,交互完成后,不做任何处理;
    jdbc再次向数据库发送update table;命令,继续和数据库完成一次交互,只不过这次没有重新加载table的数据到内存中,而是直接使用上一步的内存数据。
    提交事务,将db内存中所有的数据持久化到数据表中。
    总结一点:事务是数据库操作的基本单元,这句话意味着只要是一个事务中的所有数据操作,都只会加载一次数据到db内存,同一个事务中,操作的都是同一份内存数据。
    伪代码如下:
    begin transaction;
    delete from test_table;
    insert into test_table;
    end transaction;
    上述代码中,delete和insert操作的都是同一份数据库内存。事务是数据库操作的基本单元,可以理解为事务是数据库操作的基本内存单元。
    

    手动控制事务,则在同一个事务中,客户端和数据库只建立一次连接,因为事务始终和连接Connection对象绑定,这样一来,通过一个事务来管理客户端和数据库的连接,以及连接管理下的多个sql命令

  7. 数据库接收到jdbc发送的sql命令后,经过一系列复杂的过程,最终执行该命令,将该命令中描述的持久层数据一次性加载进内存中。
  8. 数据库执行完毕,jdbc处理相关结果,然后释放资源,关闭连接,结束和数据库的这次通信连接。

文档信息

Search

    Table of Contents