ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

07-数据库的事务

2020-12-19 23:57:24  阅读:169  来源: 互联网

标签:ps 事务 07 rs 数据库 args 提交 null conn


1.事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态。

  •  > 一组逻辑操作单元:一个或多个DML操作。
    

2.事务处理的原则:
保证所事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。
当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),那么这些修改就永久地保存
下来;要么数据库管理系统将放弃所作的所有修改,整个事务回滚(rollback)到最初状态。

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

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

3.代码的体现:
@Test
public void testUpdateWithTx() {
Connection conn = null;
try {
conn = JDBCUtils.getConnection();
System.out.println(conn.getAutoCommit());//true
//1.取消数据的自动提交
conn.setAutoCommit(false);

		String sql1 = "update user_table set balance = balance - 100 where user = ?";
		update(conn,sql1, "AA");
		
		//模拟网络异常
		System.out.println(10 / 0);
		
		String sql2 = "update user_table set balance = balance + 100 where user = ?";
		update(conn,sql2, "BB");
		
		System.out.println("转账成功");
		
		//2.提交数据
		conn.commit();
		
	} catch (Exception e) {
		e.printStackTrace();
		//3.回滚数据
		try {
			conn.rollback();
		} catch (SQLException e1) {
			e1.printStackTrace();
		}
	}finally{
		//修改其为自动提交数据
		//主要针对于使用数据库连接池的使用
		try {
			conn.setAutoCommit(true);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		JDBCUtils.closeResource(conn, null);
	}
	
}

4.考虑到事务以后,实现的通用的增删改操作: version 2.0
// 通用的增删改操作—version 2.0 (考虑上事务
public int update(Connection conn,String sql, Object… args) {// sql中占位符的个数与可变形参的长度相同!
PreparedStatement ps = null;
try {
// 1.预编译sql语句,返回PreparedStatement的实例
ps = conn.prepareStatement(sql);
// 2.填充占位符
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);// 小心参数声明错误!!
}
// 3.执行
return ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 4.资源的关闭
JDBCUtils.closeResource(null, ps);

	}
	return 0;

}

考虑到事务以后,实现的通用的查询: version 2.0
//通用的查询操作,用于返回数据表中的一条记录(version 2.0:考虑上事务)
public T getInstance(Connection conn,Class clazz,String sql, Object… args) {
PreparedStatement ps = null;
ResultSet rs = null;
try {

		ps = conn.prepareStatement(sql);
		for (int i = 0; i < args.length; i++) {
			ps.setObject(i + 1, args[i]);
		}

		rs = ps.executeQuery();
		// 获取结果集的元数据 :ResultSetMetaData
		ResultSetMetaData rsmd = rs.getMetaData();
		// 通过ResultSetMetaData获取结果集中的列数
		int columnCount = rsmd.getColumnCount();

		if (rs.next()) {
			T t = clazz.newInstance();
			// 处理结果集一行数据中的每一个列
			for (int i = 0; i < columnCount; i++) {
				// 获取列值
				Object columValue = rs.getObject(i + 1);

				// 获取每个列的列名
				// String columnName = rsmd.getColumnName(i + 1);
				String columnLabel = rsmd.getColumnLabel(i + 1);

				// 给t对象指定的columnName属性,赋值为columValue:通过反射
				Field field = clazz.getDeclaredField(columnLabel);
				field.setAccessible(true);
				field.set(t, columValue);
			}
			return t;
		}
	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		JDBCUtils.closeResource(null, ps, rs);

	}

	return null;
}

标签:ps,事务,07,rs,数据库,args,提交,null,conn
来源: https://blog.csdn.net/qq_45554909/article/details/111412417

专注分享技术,共同学习,共同进步。侵权联系[admin#icode9.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有