事物Transaction
>指包含多个微小逻辑单元的一组操作,只要其中有一个逻辑失败了,那么这一组操作就全部以失败告终,所有的数据都回归到最初的状态(回滚)不存在一半成功,一般不成功的状态。
事务有什么用?
事务在平常的CRUD当中也许不太常用,但是如果我们有一种需求,要求,一组操作中,必须全部成功执行,才算完成任务,只要有一个出错了,那么所有的任务都将回到最初的状况,恢复原样。那么这就可以使用事务了。如:银行的转账例子。
事物的使用:
命令行演示:
1. 新建一个数据库 bank , 并且创建一张表 account , 用于存储用户的姓名 和 存款。
2. 打开命令行,进入 mysql 终端
3. 先使用 show variables like '%commit%'; 来查看当前数据库的事务自动提交设置。
4. 修改事务的自动提交 为 OFF , 也就是关闭自动提交,我们想手动提交,看看数据的变化。
set autocommit = OFF ; 此处 off 小写也OK ,不区分大小写, 当然也可以写 0 , OFF 对应的是 0 , ON 对应的是 1;
5. 对某个用户的存款进行修改。 接着在 命令行下查看数据,发现数据已经变化, 但是转到 GUI 下看,并没有任何变化。 这是因为我们没有提交数据。
在命令行看到的都是假象而已。
6. 在命令行下 输入 commit ; 来提交事务。 这时候,GUI 上面就显示出来最终的结果了。
代码演示:
>代码里面的事务,主要是针对连接的。
1. 通过conn.setAutoCommit(false )来关闭自动提交的设置。
2. 提交事务 conn.commit();
3. 回滚事务 conn.rollback();
@Test
public void testTransaction(){
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JDBCUtil.getConn();
//连接,事物默认就是自动提交
conn.setAutoCommit(false);
String sql = "update account set money = money - ? where id = ?";
ps = conn.prepareStatement(sql);
//扣钱,将id为1的用户扣100块钱
ps.setInt(1, 100);
ps.setInt(2, 1);
ps.executeUpdate();
int i = 100/0;
//加钱,给id为2的用户加100块钱
ps.setInt(1, -100);
ps.setInt(2, 2);
ps.executeUpdate();
//成功:提交事务
conn.commit();
} catch (SQLException e) {
try {
conn.rollback();
} catch (Exception e2) {
e2.printStackTrace();
}
e.printStackTrace();
}finally {
JDBCUtil.release(conn, ps,rs);
}
}