十、JDBC事务处理

一、JDBC事务控制管理

1.1.什么是事务

事务是指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功。

例如:A——B转帐,对应于如下两条sql语句

update account set money=money-100 where name=a;

update account set money=money+100 where name=b;

数据库默认事务是自动提交的,也就是发一条sql它就执行一条。如果想多条sql放在一个事务中执行,则需要使用如下语句。

数据库开启事务命令:

start transaction  开启事务

Rollback  回滚事务

Commit   提交事务

1.2.事务的使用

Jdbc程序向数据库获得一个Connection对象时,默认情况下这个Connection对象会自动向数据库提交在它上面发送的SQL语句。若想关闭这种默认提交方式,让多条SQL在一个事务中执行,可使用下列语句:

扫描二维码关注公众号,回复: 1116265 查看本文章


JDBC控制事务语句

Connection.setAutoCommit(false); //  相当于mysql语句的start transaction

Connection.rollback(); //  相当于mysql语句的 rollback

Connection.commit(); //  相当于mysql语句的 commit


1.3.演示银行转帐案例

JDBC代码中使如下转帐操作在同一事务中执行。

  update from account set money=money-100 where name=a;

  update from account set money=money+100 where name=b;

设置事务回滚点

Savepoint sp = conn.setSavepoint();

Conn.rollback(sp);

Conn.commit();   

先创建数据库表

添加测试数据

package demo5;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Savepoint;

import utils.JdbcUtils;

/**
 * 演示银行转帐案例
 * 
 * @author mChenys
 *
 */
public class TransactionTest {

	public static void main(String[] args) {
		test();
	}

	private static void test() {
		Connection conn = JdbcUtils.getConnection();
		PreparedStatement stmt = null;
		Savepoint myPoint = null;
		if (null != conn) {
			try {
				// 关闭自动提交事务
				conn.setAutoCommit(false);

				// 设置回滚点
				myPoint = conn.setSavepoint();

				// 预定义sql语句
				String sql1 = "update account set money = money-100 where name = ?";
				String sql2 = "update account set money = money+100 where name = ?";

				// 执行sql语句1
				stmt = conn.prepareStatement(sql1);
				stmt.setString(1, "a");
				stmt.executeUpdate();

				// 模拟错误
				int a = 1 / 0;

				// 执行sql语句2
				stmt = conn.prepareStatement(sql2);
				stmt.setString(1, "b");
				stmt.executeUpdate();

			} catch (Exception e) {
				e.printStackTrace();

				// 发生异常后,回滚到回滚点
				try {
					if (null != conn) {
						conn.rollback();// 默认回滚到事物的开始点
						// conn.rollback(myPoint);// 回滚到离错误发生最近的回滚点
					}

				} catch (SQLException e1) {
					e1.printStackTrace();
				}
			} finally {
				// 提交事务
				if (null != conn)
					try {
						conn.commit();
					} catch (SQLException e) {
						e.printStackTrace();
					}

				// 释放资源
				JdbcUtils.release(null, stmt, conn);
			}

		}

	}

}

猜你喜欢

转载自blog.csdn.net/mchenys/article/details/80499241