问题:
如果一个功能的完成,需要n条SQL语句的联动操作,所有的SQL语句都执行成功,该功能才算完整的执行成功。
但是,现在其中一条SQL语句执行失败,但是其他的SQL语句成功执行并已经修改了数据库。这样造成功能没有执行完全。
比如:张三给李四转账1000元,SQL语句执行如下:
SQL1:update account set money=money -1000 where uname='张三';
SQL2:update account set money=money +1000 where uname='李四';
如果Sql1执行成功,但是SQL2执行失败,转账功能就失败,但是张三的钱已经少了,但是李四没有收到。
解决:
功能只要有一个SQL语句执行失败,数据全部回到没有执行之前的状态。再次重新执行。
实现:
事务管理
概念:
事务:一个事件的完成,需要很多步骤,只有每个步骤都完成,该事件才算完成。这样的事件称为事务。
管理:
只要有一个步骤不成功则将该事务所涉及的数据全部回滚。
所有的步骤都成功了将数据全部提交,真的改变到数据库。
使用:
开启jdbc的事务管理
conn.setAutoCommit(false);
当事务步骤都正确时,提交数据
conn.commit();
在catch语句中使用回滚
conn.rollback();
注意:
增加删除修改的动作必须对事务进行管理。
-----------------------------------------------------------------------------------------------------------------
package com.bjsxt.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class TestTrainsaltion{
public static void main(String[] args) {
//声明jdbc参数
String driver="oracle.jdbc.OracleDriver";
String url="jdbc:oracle:thin:@localhost:1521:XE";
String username="scott";
String password="123";
//声明jdbc变量
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
//加载驱动
Class.forName(driver);
//创建连接
conn=DriverManager.getConnection(url, username, password);
//开启事务管理
conn.setAutoCommit(false);
//创建SQL命令
String sql="update t_account set money=money+? where aname=?";
//创建SQL命令对象
ps=conn.prepareStatement(sql);
//给占位符赋值
int i=0;
//转账
ps.setDouble(1,-1000.00);
ps.setString(2, "张三");
//执行SQL命令
i=i+ps.executeUpdate();
//入账
ps.setObject(1,"asdasdasdas");
ps.setString(2,"李四");
//执行SQL命令
i=i+ps.executeUpdate();
//处理结果
if(i==2){
conn.commit();//提交数据到数据库中
}
} catch (Exception e) {
try {
conn.rollback();//回滚数据
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
e.printStackTrace();
}//关闭资源
}
}
练习:
package com.wyq.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class TestTrainsaltion {
public static void main(String[] args) {
/**
* 事物的练习
* 1、创建jdbc参数
* 2、创建jdbc变量
* 3、加载驱动
* 4、创建链接
* 5、创建SQL命令
* 6、创建执行对象
* 7、给占位符赋值
* 8、执行SQL命令
* 9、处理结果
* 10、关闭资源
*/
//创建jdbc参数
String driver = "oracle.jdbc.OracleDriver";
String url="jdbc:oracle:thin:@localhost:1521:XE";
String username="scott";
String passwd="123456";
//创建jdbc变量
Connection conn = null;
PreparedStatement ps = null;
//加载驱动
try {
Class.forName(driver);
//创建连接
conn = DriverManager.getConnection(url, username, passwd);
//开启事物
conn.setAutoCommit(false);
//创建SQL命令
String sql="update t_account set money=money+? where aname=?";
//创建SQL命令对象
ps = conn.prepareStatement(sql);
//给占位符赋值
int i=0;
//转账
ps.setInt(1,-500);
ps.setString(2, "张三");
//执行SQL命令
i=i+ps.executeUpdate();
//入账
ps.setInt(1,500);
ps.setString(2, "李四");
//执行SQL命令
i=i+ps.executeUpdate();
System.out.println("i的值为:"+i);
if(i==2){
System.out.println("转账成功");
conn.commit();
}else{
System.out.println("转账失败");
conn.rollback();
}
} catch (Exception e) {
e.printStackTrace();
}finally{
//关闭资源
try {
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
有一个问题:我写的代码为什么提交数据到不了库里?