概述
- 事务:指逻辑上的一组操作,组成这组操作的各个单元要么全都成功,要么全都失败。
- 事务作用:就是保证在一个事务中的多个操作全都成功,或者全都失败。
mysql 的事务
事务操作
sql | 描述 |
---|---|
start transaction | 开启事务 |
commit | 提交事务 |
rollback | 回滚事务 |
环境准备
代码演示
mysql 中有两种方式来管理事务
- 自动提交
mysql 默认使用自动提交的方式来管理事务,即执行一条sql语句提交一次事务
扩展:Oracle 默认不自动提交事务 - 手动提交
将mysql的全局变量autocommit设置为0-- 查询autocommit SHOW VARIABLES LIKE '%autocommit%'; -- 关闭自动提交. 0:OFF 1:ON SET AUTOCOMMIT = 0;
-- 演示 START TRANSACTION ; UPDATE accout set money = 999 where name = 'aa'; COMMIT ; -- ROLLBACK ;
JDBC的事务
事务对象
Connection 对象的API | 描述 |
---|---|
conn.setAutoCommit(false) | 开启事务 |
conn.commit() | 开启事务 |
conn.rollback() | 回滚事务 |
事务处理
- 通过c3p0连接池获取连接
- 通过dbutils来处理sql
ThreadLocal
ThreadLocal可以实现在一个线程中的数据共享。
事务特性
- 原子性(Atomicity):是指事务是一个不可分割的工作单位,事务中的操作要么全部完成,要么全部失败。
- 一致性(Consistency):是指事务前后数据的完整性必须保持一致。
- 隔离性(Isolation):是指多个用户并发访问数据库的时候,多个并发事务之间的数据相互隔离。
- 持久性(Durability):是指一个事务如果被提交,那它对数据库中数据的改变是持久性的。
并发访问的问题
如果不考虑隔离性,事务存在3个并发访问的问题
- 脏读:一个事务读取到另一个事务未提交的数据。
- 不可重复读:一个事务读取到另一个事务另一个事务已经提交(update)的数据,造成在一个事务中多次查询结果不一致。
- 虚读/幻读:一个事务读取到另一个事务另一个事务已经提交(insert)的数据,造成在一个事务中多次查询结果不一致。
隔离级别
数据库设置了4种隔离级别,用来描述两个事务并发的所有情况
-
read uncommitted
存在三个问题:脏读、不可重复读、虚读
解决零个 -
read committed
存在两个问题:不可重复读、虚读
解决一个:脏读 -
repeatable read
存在一个问题:虚读
解决两个问题:脏读、不可重复读 -
serializable
存在零个问题
解决三个问题:脏读、不可重复读、虚读 -
Oralce 默认隔离级别:read committed; Mysql 默认隔离级别:repeatable read
-
安全:read uncommitted < read committed < repeatable read < serializable
-
性能:read uncommitted > read committed > repeatable read > serializable