数据库事务

何为数据库事务?

通俗来讲,数据库事务就是把一系列操作看成一个整体,这个整体要么执行成功,要么因为种种原因,彻底执行失败,也就是这个整体中的任何一个操作都没有执行。(要么全部成功,要么全部失败)。

应用场景

经典例子:
甲方给乙方转账1000元,甲的账户先减去1000元,乙的账户再增加1000元。但是如果因为某种原因,使甲账户减去1000后,乙的账户增加1000元这个操作执行失败,这个时候就不能让甲的余额减去1000,因为甲乙的账户余额是一个整体,一荣俱荣,一损俱损。这时候就要让对甲的操作回滚(rollback)。

JDBC事务处理

数据一旦提交就不能回滚。

数据何时提交:

1.数据库每次连接关闭时自动提交。
2.数据库连接对象创建成功时默认自动提交:一条sql语句执行完之后会默认自动提交。

要允许数据库回滚,就必须满足:

1.一个事务下的多个操作要在一个数据库连接之下完成
2.设置数据库连接对象禁止自动提交

conn.setAutoCommit(fasle);

3.在一个事务的所有操作完成后再手动commit
4.当事务其中的一个操作失败后,立马rollback()

代码如下:

public void testJDBCTransaction() {
	Connection conn = null;
	try {
	// 1.获取数据库连接
	conn = JDBCUtils.getConnection();
	// 2.开启事务
	conn.setAutoCommit(false);
	// 3.进行数据库操作
	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");
	// 4.若没有异常,则提交事务
	conn.commit();
	} catch (Exception e) {
		e.printStackTrace();
	// 5.若有异常,则回滚事务
	try {
		conn.rollback();
	} catch (SQLException e1) {
		e1.printStackTrace();
	}
 } finally {
    try {
	//6.恢复每次DML操作的自动提交功能
	conn.setAutoCommit(true);
	} catch (SQLException e) {
		e.printStackTrace();
	}
    //7.关闭连接
	JDBCUtils.closeResource(conn, null, null);
 } 
}

其中的update方法为

//使用事务以后的通用的增删改操作(version 2.0)
public void update(Connection conn ,String sql, Object... args) {
	PreparedStatement ps = null;
	try {
		// 1.获取PreparedStatement的实例 (或:预编译sql语句)
		ps = conn.prepareStatement(sql);
		// 2.填充占位符
		for (int i = 0; i < args.length; i++) {
			ps.setObject(i + 1, args[i]);
		}
		// 3.执行sql语句
		ps.execute();
	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		// 4.关闭资源
		JDBCUtils.closeResource(null, ps);

	}
}

需要注意,update方法中的Connection用的是外界传递进来的参数,这也就保证了几个操作共用了一个连接对象。

事务的ACID属性

A : Atomiticy(原子性) 原子在曾经被认作是世界上最小不可分割的物质。因此这里表示的意思就是事务是最小的处理单元,不可以再被分割,内部的一切操作应该被视为一个整体。

C : Consistentcy(一致性) 事务必须从一个一致性状态变为另一个一致性状态。如果一个事务作为原子从一个一致的数据库开始运行,则在事务运行结束时,数据库和原来的数据库是一致的。一致的,但并不是相同的,比如转账这个过程中,甲账户少了1000元钱,乙账户就要多1000元钱,这个过程中账户余额总和是一致的。

I : Isolation(隔离性) 一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。也就是后面会提到的数据库的并发问题。

D : Durability(持久性) 持久性是指,一个事务一旦提交,对数据库的影响是持久性的,不可改变的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值