1.1 事务概述
l 事务指的是逻辑上的一组操作,组成这组操作的各个单元要么全都成功,要么全都失败.
l 事务作用:保证在一个事务中多次操作要么全都成功,要么全都失败.可以保证完整性.
1.2 mysql事务操作
sql语句 |
描述 |
start transaction; |
开启事务 |
commit; |
提交事务 |
rollback; |
回滚事务 |
l 操作:
n MYSQL中可以有两种方式进行事务的管理:
u 自动提交:MySql默认自动提交。及执行一条sql语句提交一次事务。
u 手动提交:先开启,再提交
1.3 JDBC事务操作
Connection对象的方法名 |
描述 |
conn.setAutoCommit(false) |
开启事务 |
conn.commit() |
提交事务 |
conn.rollback() |
回滚事务 |
1.1 DBUtils事务操作
Connection对象的方法名 |
描述 |
conn.setAutoCommit(false) |
开启事务 |
new QueryRunner() |
创建核心类,不设置数据源(手动管理连接) |
query(conn , sql , handler, params ) 或 update(conn, sql , params) |
手动传递连接 |
DbUtils.commitAndClose(conn) 或 DbUtils.rollbackAndClose(conn) |
提交并关闭连接 回顾并关闭连接 |
1.1 事务特性:ACID
l 原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
l 一致性(Consistency)事务前后数据的完整性必须保持一致。
l 隔离性(Isolation)事务的隔离性是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离。
l 持久性(Durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
1.2 并发访问问题
如果不考虑隔离性,事务存在3中并发访问问题。
1. 脏读:一个事务读到了另一个事务未提交的数据.
2. 不可重复读:一个事务读到了另一个事务已经提交(update)的数据。引发另一个事务,在事务中的多次查询结果不一致。
3. 虚读 /幻读:一个事务读到了另一个事务已经提交(insert)的数据。导致另一个事务,在事务中多次查询的结果不一致。
1.3 隔离级别:解决问题
l 数据库规范规定了4种隔离级别,分别用于描述两个事务并发的所有情况。
1. read uncommitted 读未提交,一个事务读到另一个事务没有提交的数据。
a) 存放:3个问题(脏读、不可重复读、虚读)。
b) 解决:0个问题
2. read committed 读已提交,一个事务读到另一个事务已经提交的数据。
a) 存放:2个问题(不可重复读、虚读)。
b) 解决:1个问题(脏读)
3. repeatable read :可重复读,在一个事务中读到的数据始终保持一致,无论另一个事务是否提交。
a) 存放:1个问题(虚读)。
b) 解决:2个问题(脏读、不可重复读)
4. serializable 串行化,同时只能执行一个事务,相当于事务中的单线程。
a) 存放:0个问题。
b) 解决:3个问题(脏读、不可重复读、虚读)
l 安全和性能对比
n 安全性:serializable > repeatable read > read committed > read uncommitted
n 性能 : serializable < repeatable read < read committed < read uncommitted
l 常见数据库的默认隔离级别:
n MySql:repeatable read
n Oracle:read committed