我是靠谱客的博主 文静菠萝,这篇文章主要介绍JDBC数据库的事务处理1. 事务:2. 事务处理的原则:3. 说明:4. 代码的体现:5. 考虑到事务的以后增删改查操作,现在分享给大家,希望可以做个参考。

JDBC数据库的事务处理

  • 1. 事务:
  • 2. 事务处理的原则:
  • 3. 说明:
  • 4. 代码的体现:
  • 5. 考虑到事务的以后增删改查操作

1. 事务:

一组逻辑操作单元,使数据从一种状态变换到另一种状态。
一组逻辑操作单元:一个或多个DML操作。

2. 事务处理的原则:

保证所事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。
当在一个事务中执行多个操作时,

要么所有的事务都被提交(commit),那么这些修改就永久地保存下来;
要么数据库管理系统将放弃所作的所有修改,整个事务回滚(rollback)到最初状态。

3. 说明:

  1. 数据一旦提交,就不可回滚
  2. 哪些操作会导致数据的自动提交?

    DDL操作一旦执行,都会自动提交。
    set autocommit = false 对DDL操作失效
    DML默认情况下,一旦执行,就会自动提交。
    我们可以通过set autocommit = false的方式取消DML操作的自动提交。
    默认在关闭连接时,会自动的提交数据

4. 代码的体现:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
@Test public void testUpdateWithTx(){ Connection connection = null; try { connection = JDBCUtils.getConnection(); connection.setAutoCommit(false); String sql1 = "update user_table set balance = balance - 100 where user = ?"; //1.取消数据的自动提交 update(connection,sql1,"AA"); //模拟网络异常 System.out.println(10 / 0); String sql2 = "update user_table set balance = balance + 100 where user = ?"; update(connection,sql2,"BB"); System.out.println("转账成功"); //2.提交数据 connection.commit(); } catch (Exception e) { e.printStackTrace(); //回滚数据 try { connection.rollback(); } catch (SQLException throwables) { throwables.printStackTrace(); } } finally { try { //修改其为自动提交数据 //主要针对于使用数据库连接池的使用 connection.setAutoCommit(true); } catch (SQLException throwables) { throwables.printStackTrace(); } JDBCUtils.closeResource(connection,null); } }

5. 考虑到事务的以后增删改查操作

考虑到事务的以后,实现的通用的增删改操作:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public int update(Connection connection,String sql, Object... args) { // sql中占位符的个数与可变形参的长度相同! PreparedStatement preparedStatement = null; try { // 1.预编译sql语句,返回PreparedStatement的实例 preparedStatement = connection.prepareStatement(sql); // 2.填充占位符 for (int i = 0; i < args.length; i++) { preparedStatement.setObject(i + 1, args[i]); } // 3.执行 return preparedStatement.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } finally { // 4.资源的关闭 JDBCUtils.closeResource(null,preparedStatement); } return 0; }

考虑到事务以后,实现的通用的查询:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public <T> T getInstance(Connection connection,Class<T> clazz,String sql,Object ...args){ PreparedStatement preparedStatement = null; ResultSet resultSet = null; try { preparedStatement = connection.prepareStatement(sql); for (int i = 0; i < args.length; i++) { preparedStatement.setObject(i + 1,args[i]); } resultSet = preparedStatement.executeQuery(); // 获取结果集的元数据 :ResultSetMetaData ResultSetMetaData metaData = resultSet.getMetaData(); // 通过ResultSetMetaData获取结果集中的列数 int columnCount = metaData.getColumnCount(); if (resultSet.next()){ T t = clazz.newInstance(); // 处理结果集一行数据中的每一个列 for (int i = 0; i < columnCount; i++) { // 获取列值 Object columnValue = resultSet.getObject(i + 1); // 获取每个列的列名 String columnLabel = metaData.getColumnLabel(i + 1); // 给t对象指定的columnName属性,赋值为columValue:通过反射 Field field = clazz.getDeclaredField(columnLabel); field.setAccessible(true); field.set(t,columnValue); } return t; } } catch (Exception e) { e.printStackTrace(); } finally { JDBCUtils.closeResource(null,preparedStatement,resultSet); } return null; }

最后

以上就是文静菠萝最近收集整理的关于JDBC数据库的事务处理1. 事务:2. 事务处理的原则:3. 说明:4. 代码的体现:5. 考虑到事务的以后增删改查操作的全部内容,更多相关JDBC数据库的事务处理1.内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(88)

评论列表共有 0 条评论

立即
投稿
返回
顶部