数据库事务

数据库事务:是一组逻辑操作单元,使数据从一种状态转变到另一种状态。

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

数据一旦提交,就不可回滚。

会导致数据自动提交的操作
1、DDL操作一旦执行,都会自动提交。
2、DML默认情况下,一旦执行成功,就会自动提交。(可以通过setAutoCommit(flase);的方式取消DML操作的自动提交)
3、默认在关闭连接时,事务自动提交。如果多个操作,每个操作使用的是自己单独的连接,则无法保证事务,即同一个事务的多个操作必须在同一个连接下。

JDBC程序中为了让多个SQL语句作为一个事务执行
1、调用Connection对象的setAutoCommit(flase);以取消自动提交事务。
2、在所有的SQL语句都成功执行后,调用commit();方法提交事务。
3、在出现异常时,调用rollback();方法回滚事务。

		//从外部获得连接
		Connection conn = null;
		try {
			conn = JDBCUtils.getConnection();
			//1、取消数据的自动提交,默认是自动提交
			conn.setAutoCommit(false);
			String sql1 = "update user_table set balance = balance - 100 where user = ?";
			update(conn,sql1,"AA");
			
			String sql2 = "update user_table set balance = balance + 100 where user = ?";
			update(conn,sql2,"BB");
			
			System.out.println("转账成功");
			//2、提交数据
			conn.commit();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			//3、回滚数据
			try {
				conn.rollback();
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}finally {
			try {
				//修改其为自动提交数据
				//主要针对使用数据库连接池时使用
				conn.setAutoCommit(true);
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			JDBCUtils.closeResourse(conn, null);		
		}

注意:若此时Connection没有被关闭,还可能被重复使用,则需要恢复其自动提交的状态,setAutoCommit(false)。尤其是在使用数据库连接池技术时,执行close()方法前,建议恢复为自动提交的状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值