活动地址:CSDN21天学习挑战赛
* 数据库事务:是数据库的特性
*
* Mysql的数据库引擎
* 1.在MySQL中,只有使用了Innodb引擎的数据库才支持事务
* 2.事务处理可以用来维护数据的完整性。保证sql语句要么全部执行,
* 要么全部不执行。
* 3. 发生在DML中,增删改。
*
* 事务的四大特征ACID
* 1、原子性 A。
* 一个事务,要么全部完成,要么全部不完成。
* 2、一致性 C。
* 在事务开始之前和事务结束之后,数据库的完整性没有被破坏。
* 3、隔离性 Isolation
* 数据库允许多个事务同时对数据进行处理。每个事务之间是相互隔离。
* 4、持久性 D
* 事务结束以后,对数据的增删改是永久性的。
*
* 术语:提交事务,回滚事务(事务回滚)
*
* 1、事务一旦提交,就不可能回滚。
* 2、当一个连接对象被创建时,默认情况下自动提交事务。
* 3、关闭连接时,数据会自动提交事务。
*
* 操作事务的步骤:
* 1、关闭事务的自动提交
*
* 当做出增删改操作,把变化发生在内存中,提交事务,才会真正提交给数据库。
- @Test
- public void test01() {
- Connection conn = null;
- PreparedStatement pstmt1 = null;
- PreparedStatement pstmt2 = null;
-
- try {
- conn = JDBCUtil.getConnection();
- // 关闭事务的自动提交
- // true:开启(默认) false:关闭
- // 开启一个事务
- conn.setAutoCommit(false);
- // 把id为1的账户余额-1000
- String sql1 = "update bank set balance = balance - 1000 where id = 1";
- pstmt1 = conn.prepareStatement(sql1);
- pstmt1.executeUpdate();
-
- String sql2 = "update bank set balance = balance + 1000 where id = 2";
- pstmt2 = conn.prepareStatement(sql2);
- pstmt2.executeUpdate();
-
- int i = 10 / 0;
-
- // 提交事务
- conn.commit();
-
- System.out.println("转账成功...");
-
- } catch (Exception e) {
- try {
- // 事务回滚
- conn.rollback();
- } catch (SQLException ex) {
- throw new RuntimeException(ex);
- }
- throw new RuntimeException(e);
- } finally {
- JDBCUtil.close(conn,pstmt1);
- JDBCUtil.close(null,pstmt2);
- }
- }
- @Test
- public void test03() {
- Connection conn = null;
- PreparedStatement pstmt = null;
- ResultSet rs = null;
-
- try {
- conn = JDBCUtil.getConnection();
-
- String sql = "select * from user";
-
- pstmt = conn.prepareStatement(sql);
-
- rs = pstmt.executeQuery();
-
- // 获取元数据
- /*
- 元数据:表格本身的数据
- 表格的列名,结果集的列名
- */
- ResultSetMetaData metaData = rs.getMetaData();
- // System.out.println(metaData.getColumnName(1));
- // System.out.println(metaData.getColumnName(2));
- // System.out.println(metaData.getColumnCount());
- // metaData.get
- for (int i = 1; i <= metaData.getColumnCount() ; i++) {
- metaData.getColumnName(i);
- }
-
-
- while (rs.next()) {
- int id = rs.getInt("id");
- String username = rs.getString("username");
- String password = rs.getString("password");
- System.out.println("id:" + id + ",username:" + username + ",password:" + password);
- }
-
- } catch (ClassNotFoundException e) {
- throw new RuntimeException(e);
- } catch (SQLException e) {
- throw new RuntimeException(e);
- } catch (IOException e) {
- throw new RuntimeException(e);
- } finally {
- JDBCUtil.close(conn,pstmt,rs);
- }
- }
线性结构:数据元素之间存在一对一的线性关系
顺序存储结构:顺序存储的线性表为顺序结构,其中的存储元素(地址)是连续的
链式存储结构:链式存储的线性表为链表,存储元素不(地址)一定是连续的
线性结构常见的有:数组,队列,链表,栈
非线性结构:二维数组,多维数组,广义表,树结构,图结构
稀疏(sparsearray)数组:
记录数组一共有几行几列,有多少个不同的值 int[sum+1][3]
队列:
银行排队(先入先出),
是一个有序列表,可以用数组或是链表实现链表(linked list):
是有序的列表,链表是以节点的方式来储存
每个节点包含date域,next域(指向下一个节点),各个节点不一定是连续储存,
链表分带头的链表和没有头节点的链表,根据实际的需求来确定基本的概念:
数据结构表示数据在计算机中的存储和组织形式,主要描述数据元素之间的位置关系等,选择适当的数据结构可以提高计算机程序的运行效率(时间复杂度)和存储效率(空间复杂度)
数据结构的三种层次:
1,逻辑结构--抽象层:主要描述的是数据元素之间的逻辑关系
1,静态存储区(方法区)
主要放静态数据,全局static数据和常量.
在程序编译时就分配好,在程序运行期间都存在
2,栈区
执行方法时,方法体内的局部变量在栈上创建
方法执行结束内存自动释放
效率很高,但是分配内存容量有限
3,堆区(动态内存分配)
new出来的内存
这部分内存不使用时由java垃圾回收器回收