jdbc—事务

Posted noooooob

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jdbc—事务相关的知识,希望对你有一定的参考价值。

1.事务的基本概念(查询是没有事务的)

  - 一组要么同时执行成功,要么同时执行失败的SQL语句。是数据库操作的一个执行单元。

  - 事务开始于:

    - 连接到数据库上,并执行一条DML语句(INSERT,UPDATE或DELETE)。

    - 前一个事务结束后,又输入了另一条DML语句。

  - 事务结束于:

    - 执行COMMIT或ROLLBACK语句。

    - 执行一条DDL语句,例如CREATE TABLE语句;在这种情况下,会自动执行COMMIT语句。

    - 执行一条DCL语句,例如GRANT语句;在这种情况下,会自动执行COMMIT语句。

    - 断开与数据库的连接。

    - 执行了一条DML语句,该语句却失败了,在这种情况中,或为这个无效的DML语句执行ROLLBACK语句。

2.事务的四大特点(ACID)

  - atomictiy(原子性)

    表示一个事务内的所有操作是一个整体,要么全部成功,要么全部失败。

  - consistency(一致性)

    表示一个事务内有一个操作失败时,所有更改过的数据都必须回滚到修改前的状态。

  - isolation(隔离性)

    事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的数据,事务不会查看

    中间状态的数据 

      - 事务隔离级别从低到高(效率从高到低): 

        - 读取未提交(Read Uncommited)

        - 读取已提交(Read commited)

        - 可重复读(Repeatable Read)

        - 序列化(serializable)(锁表)

  - durability(持久性)

    持久性事务完成之后,它对于系统的影响是永久性的。

  

package com.yf.jdbc.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * 测试事务
 * @author yangf
 *
 */
public class Demo06 {
    public static void main(String[] args) {
        Connection con = null;
        PreparedStatement ps1 = null;
        PreparedStatement ps2 = null;
        try {
            // 加载数据库驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 获得connection对象 建立与数据库连接
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc", "root", "123456");
            // JDBC中默认自动提交事务
            con.setAutoCommit(false);
            
            ps1 = con.prepareStatement("insert into t_user (username,pwd) values (?,?)");
            ps1.setString(1, "yyf");
            ps1.setInt(2, 22222);
            ps1.execute();
            System.out.println("插入一个用户yyf");
            
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            
            ps2 = con.prepareStatement("insert into t_user (username,pwd) values (?,?,?)");
            ps2.setString(1, "wwwy");
            ps2.setInt(2, 3333);
            ps2.execute();
            System.out.println("插入一个用户wwwy");
            
            
            con.commit();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            try {
                con.rollback();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        } catch (SQLException e) {
            e.printStackTrace();
            try {
                con.rollback();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        } finally {
            if (ps1 != null) {
                try {
                    ps1.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (con != null) {
                try {
                    con.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

 

以上是关于jdbc—事务的主要内容,如果未能解决你的问题,请参考以下文章

BottomNavigationView 滞后于片段事务

分布式事务系列第二篇,回顾 Jdbc 事务

JAVA基础:JDBC的使用 附详细代码

JDBC 事务

Spring JPA无法提交jdbc事务的解决办法

JDBC事务提交/回滚实例