JDBC——事物管理

案例:银行转账问题,数据库如下

相关API

setAutoCommit(boolean autoCommit)  将此连接的自动提交模式设置为给定状态。设置事务是否自动提交如果设置为false,表示手动提交事务

setSavepoint() 在当前事务中创建一个未命名的保存点 (savepoint),并返回表示它的新 Savepoint 对象。

void rollback() ;     回滚(出现异常时候,所有已经执行成功的代码需要回退到事务开始前的状态。)

java.sql接口 Savepoint  public interface Savepoint   保存点的表示形式,保存点是可以从 Connection.rollback 方法引用的当前事务中的点。将事务回滚到保存点时,在该保存点之后所作的全部更改都将被撤消。 

// 1. 转账
	public void trans1() {

		String sql_zs = "UPDATE account SET money=money-1000 WHERE name=‘张三‘;";
		String sql_ls = "UPDATE account SET money=money+1000 WHERE name=‘李四‘;";

		try {
			con = JDBCU.getConnection(); // 默认开启的隐士事务
			con.setAutoCommit(true);//默认值是true,写不写一样

			/*** 第一次执行SQL ***/
			pstmt = con.prepareStatement(sql_zs);
			pstmt.executeUpdate();

			/*** 第二次执行SQL ***/
			pstmt = con.prepareStatement(sql_ls);
			pstmt.executeUpdate();

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCU.closeAll(con, pstmt, null);
		}

	}

 



 

当一方出现问题,这个时候需要管理,除了两者都提交成功外,其他的都回滚原来状态

@Test
	// 2. 转账,使用事务
	public void trans2() {

		String sql_zs = "UPDATE account SET money=money-1000 WHERE name=‘张三‘;";
		//故意出错,数据库会出错。
		String sql_ls = "UPDATE account SET money=money1+1000 WHERE name=‘李四‘;";

		try {
			con = JDBCU.getConnection(); // 默认开启的隐士事务
			// 一、设置事务为手动提交
			con.setAutoCommit(false);

			/*** 第一次执行SQL ***/
			pstmt = con.prepareStatement(sql_zs);
			pstmt.executeUpdate();

			/*** 第二次执行SQL ***/
			pstmt = con.prepareStatement(sql_ls);
			pstmt.executeUpdate();

		} catch (Exception e) {
			try {
				// 二、 出现异常,需要回滚事务
				con.rollback();
			} catch (SQLException e1) {
			}
			e.printStackTrace();
		} finally {
			try {
				// 三、所有的操作执行成功, 提交事务
				con.commit();
				JDBCU.closeAll(con, pstmt, null);
			} catch (SQLException e) {
			}
		}

	}


回滚到指定的代码段

// 3. 转账,使用事务, 回滚到指定的代码段
	//第一次有错误,而第二次有错误,现在想在第一次和第二次之间设置一个还原点
	@Test
	public void trans() {
		// 定义个标记
		Savepoint sp = null;

		// 第一次转账
		String sql_zs1 = "UPDATE account SET money=money-1000 WHERE accountName=‘张三‘;";
		String sql_ls1 = "UPDATE account SET money=money+1000 WHERE accountName=‘李四‘;";

		// 第二次转账
		String sql_zs2 = "UPDATE account SET money=money-500 WHERE accountName=‘张三‘;";
		String sql_ls2 = "UPDATE1 account SET money=money+500 WHERE accountName=‘李四‘;";

		try {
			con = JDBCU.getConnection(); // 默认开启的隐士事务
			con.setAutoCommit(false);       // 设置事务手动提交

			/*** 第一次转账 ***/
			pstmt = con.prepareStatement(sql_zs1);
			pstmt.executeUpdate();
			pstmt = con.prepareStatement(sql_ls1);
			pstmt.executeUpdate();

			// 回滚到这个位置?
			sp = con.setSavepoint(); 

			/*** 第二次转账 ***/
			pstmt = con.prepareStatement(sql_zs2);
			pstmt.executeUpdate();
			pstmt = con.prepareStatement(sql_ls2);
			pstmt.executeUpdate();

		} catch (Exception e) {
			try {
				// 回滚 (回滚到指定的代码段)
				con.rollback(sp);
			} catch (SQLException e1) {
			}
			e.printStackTrace();
		} finally {
			try {
				// 提交
				con.commit();
			} catch (SQLException e) {
			}
			JDBCU.closeAll(con, pstmt, null);
		}

	}

  

时间: 2024-11-05 06:07:42

JDBC——事物管理的相关文章

spring事物管理--声明式(AspectJ)(推荐使用)

1.表结构及数据 2.需引入的jar包: 3.业务层(Service).持久层(Dao)接口与实现类 Service接口: //转账案例业务层接口 public interface AccountService { /** * @param out :转出账号 * @param in :转入账号 * @param money :转账金额 */ public void transfer(String out,String in,Double money); } Service实现类: //转账案例

Spring学习——声明式事物管理

1.什么是事物? 事务是一组操作的执行单元,相对于数据库操作来讲,事务管理的是一组SQL指令,比如增加,修改,删除等,事务的一致性,要求,这个事务内的操作必须全部执行成功,如果在此过程种出现了差错,比如有一条SQL语句没有执行成功,那么这一组操作都将全部回滚! 2.事物的四大特性: Atomic(原子性):要么都成功,要么都失败; Consistent(一致性):数据应该不被破坏; Isolate(隔离性):用户间操作不相混淆 ; Durable(持久性):永久保存 3.实际开发中,需要事物控制

声明事物管理器

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p&q

[原创]java WEB学习笔记109:Spring学习---spring中事物管理

博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ------------------------------------------------------------------------------------------------------------------

Spring中的事物管理,用 @Transactional 注解声明式地管理事务

事物: 事务管理是企业级应用程序开发中必不可少的技术,  用来确保数据的 完整性和 一致性. 事务就是一系列的动作, 它们被当做一个单独的工作单元. 这些动作要么全部完成, 要么全部不起作用 事务的四个关键属性: 原子性:事务是一个原子操作, 由一系列动作组成. 事务的原子性确保动作要么全部完成要么完全不起作用. 一致性:一旦所有事务动作完成, 事务就被提交. 数据和资源就处于一种满足业务规则的一致性状态中. 隔离性:可能有许多事务会同时处理相同的数据, 因此每个事物都应该与其他事务隔离开来,

集成Spring事物管理

单独使用MyBatis对事物进行管理 前面MyBatis的文章有写过相关内容,这里继续写一个最简单的Demo,算是复习一下之前MyBatis的内容吧,先是建表,建立一个简单的Student表: create table student ( student_id int auto_increment, student_name varchar(20) not null, primary key(student_id) ) 建立实体类Student.java: public class Studen

Spring入门第4天--Spring事物管理

文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 2016.06.24 lutianfei none 事务 事务:是逻辑上一组操作,要么全都成功,要么全都失败. 事务特性:ACID 原子性:事务不可分割 一致性:事务执行的前后,数据完整性保持一致. 隔离性:一个事务执行的时候,不应该受到其他事务的打扰 持久性:一旦结束,数据就永久的保存到数据库. 如果不考虑隔离性: 脏读:一个事务读到另一个事务未提交数据 不可重复读:一个事务读到另一个事务已经提交数据(update)导致一个事

spring 事物管理

1 在spring中支持编程式事物和声明式事务管理,通常使用声明式事物管理,声明式的事物管理是基于aop机制实现的使用很方便. 2 spring支持单一数据库资源的事物管理和跨越多个数据库资源的事物管理既JTA全局事物. 3 在spring中提供了多个事物管理类,常用的是;DataSourceTransactionManager,HibernateTransactionManager和JtaTransactionManager. DataSourceTransactionManager :数据源

spring事物管理--声明式(AspectJ)注解实现 (推荐使用)

1.表结构及数据 2.使用的jar包 3.service.Dao层接口与实现类: Dao接口: //转账案例持久层接口 public interface AccountDao { /** * @param out :转出账号 * @param money :转账金额 */ public void outMoney(String out,Double money); /** * @param in :转入账号 * @param money :转账金额 */ public void inMoney(