我是靠谱客的博主 文静菠萝,最近开发中收集的这篇文章主要介绍JDBC数据库的事务处理1. 事务:2. 事务处理的原则:3. 说明:4. 代码的体现:5. 考虑到事务的以后增删改查操作,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
JDBC数据库的事务处理
- 1. 事务:
- 2. 事务处理的原则:
- 3. 说明:
- 4. 代码的体现:
- 5. 考虑到事务的以后增删改查操作
1. 事务:
一组逻辑操作单元,使数据从一种状态变换到另一种状态。
一组逻辑操作单元:一个或多个DML操作。
2. 事务处理的原则:
保证所事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。
当在一个事务中执行多个操作时,
要么所有的事务都被提交(commit),那么这些修改就永久地保存下来;
要么数据库管理系统将放弃所作的所有修改,整个事务回滚(rollback)到最初状态。
3. 说明:
- 数据一旦提交,就不可回滚
- 哪些操作会导致数据的自动提交?
DDL操作一旦执行,都会自动提交。
set autocommit = false 对DDL操作失效
DML默认情况下,一旦执行,就会自动提交。
我们可以通过set autocommit = false的方式取消DML操作的自动提交。
默认在关闭连接时,会自动的提交数据
4. 代码的体现:
@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. 考虑到事务的以后增删改查操作
考虑到事务的以后,实现的通用的增删改操作:
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;
}
考虑到事务以后,实现的通用的查询:
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. 事务:2. 事务处理的原则:3. 说明:4. 代码的体现:5. 考虑到事务的以后增删改查操作所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复