03jdbc之事务回滚点(保留点)、并发控制、JDBC异常处理

事务回滚点:

比如:往bank表中插入数据,设置事务回滚点,插入1000条信息,设置一个回滚点,在插入8250条信息的时候将会出错,因为回滚点为1000一次,所以会插入8000条信息。
(注意:是带上数据库以前所有的数据,一共插入8000条数据)

PreparedStatement ps = null;
		Connection con = null;
		Savepoint sp = null;//设置回滚点

		try {
			con = TestC3P0.getConnectionTest();
			String sql = "insert into bank(name,money) values(?,?)";
			ps = con.prepareStatement(sql);
			con.setAutoCommit(false);
			for (int i = 0; i < 10000; i++) {
				if (i == 8250) {//设置在回滚条件
					int f = 1 / 0;
				}

				ps.setString(1, "zdc");
				ps.setDouble(2, 5000);
				ps.executeUpdate();

				if (i % 1000 == 0) {//设置回滚点
					sp = con.setSavepoint();
				}

				con.commit();//事务提交
			}
		} catch (Exception a) {
			a.printStackTrace();
			try {
				con.rollback(sp);//回滚
				// con.commit();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} finally {
			try {
				con.setAutoCommit(true);
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

Conn.rollback(sp);
void rollback(Savepoint savepoint)
也就是上边的那个!!!回滚!!!
取消所有设置给定 Savepoint 对象之后进行的更改。
把数据回滚到,指定的回滚点的位置。
Conn.commit(); //回滚后必须要提交

数据库并发:

  • 数据库并发就是不同的事务对同一部分数据执行操作
  • 事务T1和T2(或多个事务)对同一部分数据进行改,删,查操作:T1 进行修改而T2进行查询。

数据库并发控制就是要用正确的方式调度并发操作,使一个用户事务的执行不受其它事务的干扰,从而避免造成数据的不一致

  • 在JDBC中,通过connection可以设置事务隔离级别来对并发进行控制
  • 事务隔离级别就是事务执行时受打扰的程度,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性就越好,但并发性越差,效率越低

数据库并发容易导致的问题

  • 读脏数据:
  • 事务T1修改某一数据,并将其写回数据库,事务T2读取同一数据后,T1由于某种原因被撤消,这时T1已修改过的数据恢复原值,T2读到的数据就与数据库中的数据不一致,我们称T2读到的数据就为"脏"数据,即不正确的数据。
  • 不可重复读:
  • 不可重复读是指事务T1读取数据后,事务T2执行更新操作,使T1无法再现前一次读取结果。
  • 幻读:
  • 事务T1按一定条件从数据库中读取某些数据记录后,事务T2插入了一些记录,当T1再次按相同条件读取数据时,发现多了一些记录。

Connection中查看和设置隔离级别的方法

getTransactionIsolation():查看隔离级别
setTransactionIsolation(int  level):设置隔离级别
Connection中的事务隔离级别(Connection接口中的常量)
TRANSACTION_NONE:此级别不支持事务
TRANSACTION_READ_UNCOMMITTED:此级别允许某一事务读其他事务还没有更改完的数据。允许发生脏读 、不可重复读和幻读。
TRANSACTION_READ_COMMITTED:此级别要求某一事务只能等别的事务全部更改完才能读。可以防止发生脏读,但不可重复读和幻读有可能发生。
TRANSACTION_REPEATABLE_READ:此级别要求某一事务只能等别的事务全部更改完才能读而且禁止不可重复读。也就是可以防止脏读和不可重复读,但幻读有可能发生。
TRANSACTION_SERIALIZABLE:此级别防止发生脏读、不可重复读和幻读,事务只能一个接着一个地执行,而不能并发执行。

JDBC异常处理:

通常使用SQLException和SQLWarning表示异常和警告信息

  • SQLException表示异常
  • 如驱动不匹配,进行了数据库不支持的操作等,会导致应用程序终止
  • SQLWarning表示警告
  • 如某些操作不规范但仍然能执行,不会导致应用程序终止

SQLException类:

使用JDBC访问数据库时,下列情况会导致SQL异常的产生

  • JDBC与数据库服务器之间的通信信息丢失
  • 错误的命令
  • 使用数据库不支持的函数
  • 访问不存在的列

SQLException类提供了数据库访问错误或其他错误的信息,主要包括:

  • getNextException()方法返回下一个SQL异常对象
  • getErrorCode()方法返回用整数表示的错误代码(由数据库厂商提供)
  • getMessage()方法返回用字符串表示的错误信息

SQLWarning类:

  • 是SQLException的子类
  • 因非致命SQL状态而生成
  • 不会导致应用程序中断运行
  • 存储最近产生的SQL警告信息
  • 使用getNextWaring()方法获得下一个警告信息
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值