1.什么叫数据库事务?
事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态。
> 一组逻辑操作单元:一个或多个DML操作。
2.事务处理的原则:保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。
当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),那么这些修改就永久地保存
下来;要么数据库管理系统将放弃所作的所有修改,整个事务回滚(rollback)到最初状态。
3.数据一旦提交,就不可回滚
4.哪些操作会导致数据的自动提交?
>DDL操作一旦执行,都会自动提交。
>set autocommit = false 对DDL操作失效
>DML默认情况下,一旦执行,就会自动提交。
>我们可以通过set autocommit = false的方式取消DML操作的自动提交。
>默认在关闭连接时,会自动的提交数据
针对user_table表为例,模拟 A--->B转账500。user_table表结构如下:
代码实现:
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import org.junit.Test;
import com1jdbcConnection.jdbcConnection;
public class TransactionTest {
@Test
public void testUpdateWithTransaction(){
Connection conn=null;
try {
//1、获取连接
conn = jdbcConnection.connection();
//2、取消自动提交
conn.setAutoCommit(false);
String sql1="update user_table set balance=balance-500 where user=?";
update(conn,sql1,"AA");
String sql2="update user_table set balance=balance+500 where user=?";
update(conn,sql2,"BB");
} catch (Exception e) {
e.printStackTrace();
//3、数据回滚
try {
conn.rollback();
System.out.println("转账失败");
} catch (SQLException e1) {
e1.printStackTrace();
}
}finally{
//4、提交数据
try {
conn.commit();
System.out.println("转账成功");
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
//5、修改其为自动提交数据,主要针对于使用数据库连接池的使用
conn.setAutoCommit(true);
} catch (SQLException e) {
e.printStackTrace();
}
try {
//6、关闭资源
jdbcConnection.CloseResource(conn, null);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
public void update(Connection conn,String sql,Object ...args){//sql中占位符的个数与可变形参的长度一致
//1、编译sql语句
PreparedStatement ps=null;
try {
ps = conn.prepareStatement(sql);
//2、填充占位符
for(int i=0;i<args.length;i++){
ps.setObject(i+1, args[i]);
}
//3、执行
ps.execute();
} catch (Exception e) {
e.printStackTrace();
}finally{
//4、关闭资源
jdbcConnection.CloseResource(null, ps);
}
}
}
代码中jdbcConnection类的构造查看:封装数据库的连接关闭操作_qq_46053741的博客-CSDN博客