事务(一)

事物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);
	}
}