何为数据库事务?
通俗来讲,数据库事务就是把一系列操作看成一个整体,这个整体要么执行成功,要么因为种种原因,彻底执行失败,也就是这个整体中的任何一个操作都没有执行。(要么全部成功,要么全部失败)。
应用场景
经典例子:
甲方给乙方转账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(持久性) 持久性是指,一个事务一旦提交,对数据库的影响是持久性的,不可改变的。