事务定义:
在一组业务逻辑(ABCD)操作中, 要么全部成功, 要么全部失败
事务特性: ACID
原子性: 事务是一个不可分割的整体
一致性: 事务的操作前后, 数据保持一致 (完整)
隔离性: 两个事务的并发问题 (是一个问题需要解决)
持久性: 事务一旦提交就不能回滚
并发访问问题:(隔离问题)
脏读: 一个事务读到了另一个事务没有提交的数据
不可重复读: 一个事务读到了另一个事务已经提交的数据(发生在:更新 update)
虚读 / 幻读: 一个事务读到了另一个事务已经提交的数据(发生在: 添加 insert) -- 纯理论(因为这种问题在内部已经解决了)
隔离级别: 用于解决隔离问题
1. 读未提交级别: 一个事务读到了另一个事务没有提交的数据,
存在3个问题: 脏读,不可重复读,虚读
2. 读已提交级别: 一个事务读到了另一个事务已经提交的数据,
解决1个问题 : 脏读, 存在2个问题: 不可重复读,虚读
3. 可重复读级别: 一个事务中, 多次读取的数据是重复的,
解决2个问题 : 脏读,不可重复读, 存在1个问题:幻读
4. 串行化级别: 一次执行一个事务 (单事务)(各执行各的)
常见数据库默认隔离级别:
mySQL: 默认级别: 可重复读
oracle: 默认级别: 读已提交
性能和安全:
性能: 读未提交级别 > 读已提交 > 可重复读 > 串行化
安全: 读未提交级别 < 读已提交 < 可重复读 < 串行化
mysql事务演示:(cmd中)
# 开启事务
mysql> start transaction;
mysql> 更新语句付款;
mysql> 更新语句收款;
#操作1:提交
mysql> commit;
#操作2:回滚
mysql> rollback;
jdbc事务演示:
//获得连接
Connection conn = null;
try {
//1 开始事务 (自动提交关闭)
conn.setAutoCommit(false);
// 操作
// 更新语句付款;
// 更新语句收款;
//2 提交事务
conn.commit();
} catch (Exception e) {
//3 回滚事务
conn.rollback();
} finally {
//4 释放资源
conn.close();
}
MyBatis事务操作:
SqlSession sqlSession = null;
try {
//1 开始事务,默认关闭自动提交,言外之意开启事务
// 操作
// 更新语句付款;
// 更新语句收款;
//2 提交事务
sqlSession.commit();
} catch (Exception e) {
//3 回滚事务
sqlSession.rollback();
} finally {
//4 释放资源
sqlSession.close();
}