事务(一)

xiaoxiao2025-04-10  9

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

 

转载请注明原文地址: https://www.6miu.com/read-5027917.html

最新回复(0)