事物的回滚和提交学习

问题:
	如果一个功能的完成,需要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();
			}
			
		}
		
	}

}

有一个问题:我写的代码为什么提交数据到不了库里?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值