030_jdbc-mysql事务

1. 事务概念

1.1. 事务(Transaction)其实指的是一组操作, 里面包含许多个单一的逻辑。只要有一个逻辑没有执行成功, 那么都算失败。所有的数据都回归到最初的状态。

2. 为什么要有事务?

2.1. 为了确保逻辑的成功。例子: 银行的转账。

3. 事务的特性

3.1. 原子性(Atomicity): 指的是事务是一个不可分割的工作单位, 事务中的多个操作要么都发生, 要么都不发生。

3.2. 一致性(Consistency): 指的是事务执行前后, 数据的完整性没有被破环。比如A向B转了钱, 转账前后钱的总数不变。

3.3. 隔离性(Isolation): 指的是多个用户并发访问数据数据库时, 一个用户的事务不能被其他用户的事务所干扰, 多个并发事务之间的数据相互隔离。比如事务A和事务B都修改同一条记录, 这条记录就会被重复修改或者后者会覆盖前者的修改记录。

3.4. 持久性(Durability): 指的是事务完成后, 事务对数据库的更新被保存到数据库, 其结果是永久的。

4. 查询和关闭事务的自动提交

5. 事务的操作步骤

5.1. 开启事务: start transaction。

5.2. 提交事务commit, 数据将会写到数据库。

5.3. 回滚事务rollback, 数据回滚到最初的状态。

5.4. 事务只是针对连接对象, 如果再开一个连接对象, 那么默认是自动提交的。

6. 创建一张account表, 并插入2条数据。

7. 演示事务

8. 事务例子

8.1. 新建一个JDBC_Transaction工程, 使用我们之前的JDBCUtil.java和jdbc.properties属性文件

8.2. 事务

package com.lywgames.myjdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.lywgames.util.JDBCUtil;

public class MyJDBC {
	public static void main(String[] args) {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		
		try {
			conn = JDBCUtil.getConn();
			// 1.关闭事务自动提交
			conn.setAutoCommit(false);
			
			// 2.扣除用户1的钱
			ps = conn.prepareStatement("update account set money = money - ? where id = ?");
			ps.setInt(1, 100);
			ps.setInt(2, 1);
			ps.executeUpdate();
			
			// 3.抛一个除数为0异常
			int v = 2 / 0;
			
			JDBCUtil.closeSt(ps);
			// 4.给用户2加钱
			ps = conn.prepareStatement("update account set money = money + ? where id = ?");
			ps.setInt(1, 100);
			ps.setInt(2, 2);
			ps.executeUpdate();
			
			// 5.提交事务
			conn.commit();
		} catch (SQLException e) {
			try {
				// 6.回滚事务
				conn.rollback();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
			e.printStackTrace();
		} finally {
			JDBCUtil.release(conn, ps, rs);
		}
	
	}
}

8.3. 运行前查看id为1和2的钱分别是2000和1000

8.4. 运行出错, id为1和2的钱还是2000和1000

8.5. 注释掉会抛异常的代码

8.6. 运行后没有出错, id为1的人的钱变为1900, id为2的人的钱变为1100

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值