事务处理就是当执行多个SQL指令,因某个指令有误,则取消执行所有的命令

它的作用是保证各项的完整性和一致性

JDBC的数据操作时

commit():提交事务

rollback():回退事务

绝位于java.sql.Connection接口类中

JDBC中的事务操作时默认提交的

可用setAutoCommit(false)来禁止自动提交

Java API中的JDBC事务是通过Connection对象进行控制的

提供了两种方式:自动提交模式&手动提交模式

默认是自动提交模式

事务处理:

public void updata1(Connection conn,String sql){
Statement statement = null;
try {
conn = getConnection();
statement = (Statement) conn.createStatement();
statement.executeUpdate(sql);
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}finally{
JdbcTools.Close(null, statement, null);
}
}
    @Test
public void test() {
Connection conn = null; try {
conn = JdbcTools.getConnection();
//开始事物,取消默认提交
conn.setAutoCommit(false);
String sql = "update student set sclass = "
+ "sclass-100 where id = 17";
updata1(conn, sql); int i = 10 / 0;
System.out.println(i); sql = "update student set sclass = "
+ "sclass-100 where id = 18";
updata1(conn, sql); //提交事物
conn.commit();
} catch (Exception e) {
e.printStackTrace();
//如出现异常,回滚事物
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}finally{
Close(null, null, conn);
}

分析代码:很明显可以看到,代码中出现int i= 10 / 0;在进行打印,此时出错了

此时不会因为一个错误而导致之前的操作失败,上一个插入语句可以成功执行

以上对事务的简单解读

测试事物的级别:

Oracle 支持的 2 种事务隔离级别:READ COMMITED, SERIALIZABLE. Oracle 默认的事务隔离级别为: READ COMMITED
Mysql 支持 4 中事务隔离级别. Mysql 默认的事务隔离级别为: REPEATABLE READ
@Test
public void JiBie(){
Connection conn = null; try {
conn = JdbcTools.getConnection();
//开始事物,取消默认提交
conn.setAutoCommit(false);
String sql = "update student set sclass = "
+ "sclass-100 where id = 17";
Level(sql); //提交事物
conn.commit(); } catch (Exception e) {
e.printStackTrace();
}finally{
Close(null, null, conn);
}
} public void Level(String sql){
Connection conn = null;
Statement statement = null; try {
conn = getConnection();
//设置级别
conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
statement = (Statement) conn.createStatement();
statement.executeUpdate(sql);
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}finally{
Close(null, statement, conn);
}
}

批量处理:

批量对数据库进行大量的操作
PreparedStatement
    @Test
public void testPiLiangPreparedStatement() {
Connection conn = null;
PreparedStatement preparedstatement = null;
String sql = null;
try {
conn = getConnection();
conn.setAutoCommit(false);
sql = "insert into student(sname,sclass) values(?,?)";
preparedstatement = (PreparedStatement) conn.prepareStatement(sql);
// 开始时间
long begin = System.currentTimeMillis();
for (int i = 0; i < 10; i++) {
preparedstatement.setString(1, "name" + i);
preparedstatement.setInt(2, 1234 + i);
preparedstatement.executeUpdate(); //对时间进行大度的优化
//积攒
preparedstatement.addBatch();
//当积攒到一定的成都自动进行清空
if(( i + 1) % 300 == 0){
preparedstatement.executeBatch();
preparedstatement.clearBatch();
}
}
//若总条数不再是批量的整数倍,还需要再次进行清理
if(10 % 300 != 0){
preparedstatement.executeBatch();
preparedstatement.clearBatch();
}
// 结束时间
long end = System.currentTimeMillis();
System.out.println(end - begin);
conn.commit();
} catch (Exception e) {
e.printStackTrace();
conn.rollback();
} finally {
Close(null, preparedstatement, conn);
}
}
Statement
   // 批量对数据库进行大量的操作
// Statement
@Test
public void testPiLiangStatement() {
Connection conn = null;
Statement statement = null;
String sql = null;
try {
conn =getConnection();
conn.setAutoCommit(false);
statement = (Statement) conn.createStatement();
// 开始时间
long begin = System.currentTimeMillis();
for (int i = 0; i < 10; i++) {
sql = "insert into student(sname,sclass) values('" + 123 + " ','" + (i + 1) + "')";
statement.executeUpdate(sql);
}
// 结束时间
long end = System.currentTimeMillis();
System.out.println(end - begin);
conn.commit();
} catch (Exception e) {
e.printStackTrace();
conn.rollback();
} finally {
Close(null, statement, conn);
}
}

两者在插入相同的数据量之后,进行时间的对比

PreparedStatement显然比Statement执行的速度快

JDBC(6)事务处理&批量处理的更多相关文章

  1. JDBC的事务处理

    JDBC的事务处理 事务,也是数据库事务,指的是作为单个逻辑工作单元执行的一系列操作.正常的情况下,操作应该顺利进行,与操作相关的所有数据库信息也成功地更新: 但是,如果在这一系列过程中任何一个环节出 ...

  2. Spring学习5-Spring整合JDBC及其事务处理(注解方式)

    一.整合的步骤   1.步骤一:首先要获得DataSource连接池(推荐使用B方式): 要对数据库执行任何的JDBC操作,需要有一个Connection.在Spring中,Connection对象是 ...

  3. JDBC 元数据 事务处理

    使用 JDBC 驱动程序处理元数据 Java 通过JDBC获得连接以后,得到一个Connection 对象,可以从这个对象获得有关数据库管理系统的各种信息,包括数据库中的各个表,表中的各个列,数据类型 ...

  4. JDBC中的批量插入和乱码解决

    字符集-乱码问题 用JDBC访问MySql数据库的时候,如果JDBC使用的字符集和MySql使用的字符集不一致,那么会导致乱码发生.解决办法当时是在使用JDBC的时候指定和数据库一样的字符集.我们可以 ...

  5. JDBC 复习4 批量执行SQL

    1使用jdbc进行批量执行SQL在实际的项目开发中,有时候需要向数据库发送一批SQL语句执行,这时应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率. package dbe ...

  6. 【JDBC核心】批量插入

    批量插入 批量执行 SQL 语句 当需要成批插入或者更新记录时,可以采用 Java 的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理.通常情况下比单独提交处理更有效率. JDBC 的批量 ...

  7. Spring整合JDBC及事务处理

    1.Spring整合JDBC DAO是数据访问对象(data access object)的简写.接口是实现松耦合的关键,Spring也鼓励使用接口,但不是强制的. 捕获异常时希望能尝试从异常状态中恢 ...

  8. JDBC连接MYSQL,批量执行SQL语句或在执行一个SQL语句之前执行一个SQL语句

    conn = MysqlJdbcUtils.getConnection(); Statement ps=conn.createStatement(); ps.addBatch("trunca ...

  9. JDBC的事务处理 JDBC事务处理 JDBC教程

    JDBC的事务基本知识 事务的定义:一个事务是由一条或多条对数据库操作的sql语句所组成的一个不可分割的工作单元,只有当事务中的所有操作都正常执行后,整个事务才会提交给数据库. 结束事务的操作:com ...

随机推荐

  1. 理解Xaml标记语言

    理解XAML XAML基于XAML,因而具有与XAML相似的特性.在XAMl中,同样必须区分大小写,但是Xaml以.xaml作为扩展名,表示这是一个应用程序的标记扩展文件.WPF中的XAML主要用于创 ...

  2. C3P0数据库连接池的java实现

    1.配置准备 导入jar包 c3p0-0.9.2-pre1.jar mchange-commons-0.2.jar 数据库驱动包,如:mysql-connector-java-5.1.28-bin.j ...

  3. Lucene学习之四:Lucene的索引文件格式(3)

    本文转载自:http://www.cnblogs.com/forfuture1978/archive/2010/02/02/1661436.html ,略有删改和备注. 四.具体格式 4.2. 反向信 ...

  4. Vue-Render函数理解示例

    对应文档节点: https://vuefe.cn/v2/guide/render-function.html#Slots <body> <div id="app" ...

  5. Be opinionated out of the box but get out of the way quickly as requirements start to diverge from

    Be opinionated out of the box but get out of the way quickly as requirements start to diverge from t ...

  6. springboot自定义异常

    SpringBoot自定义异常以及异常处理 在web项目中,我们可能需要给前端返回不同的提示码.例如:401表示没有权限,500代表位置异常,200代表请求成功等.但是这些提示码远远不能满足我们返回给 ...

  7. PHP支持多线程吗?

    https://zhidao.baidu.com/question/2053529640037778107.html

  8. Html5的新特性总结

    新加语义化标签: HTML5其实是关于图像,位置,存储,速度的优化和改进 图像: 到目前为止,基本上想要直接在网页上进行绘图还是不能轻易完成的,即使是几何图形也不可以.在浏览器当中直接能跟图片的交互操 ...

  9. Algorithm——最长公共前缀

    一.问题 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow ...

  10. 修改vue的配置项支持生产环境下二级目录访问的方法

    本文主要记录如何配置vue的打包文件配置项,使打包后的文件可以支持二级目录的访问. 1.常规打包 在实际的项目中,我们通常都使用 npm run build 直接打包文件后丢到服务器上访问 打包后的文 ...