ack 每一个 复读 evel 多少 ssi 查看 隔离级别
1. 什么是事物
事物是逻辑上的的一种操作, 这个操作过程中的每一个元素要么全部成功, 要么全部失败. 例如, 银行转账过程视为一个事物, 转出过程和转入过程要求全部成功或全部失败, 通过提交事物或者回滚事物实现.
2. 事物的作用
保证一组操作中要么全部成功, 要么全部失败.
3. 事物的特性 (重要)
ACID
Atomicity 原子性: 是指事物是一个不可分割的工作单位事物的操作要么全部成功, 要么全部失败
Consister 一致性: 事物前后数据的完整性保持一致 (例如银行转账, 转出账号少多少钱, 转入账号就需要多多少钱)
Isolation 隔离性: 是指多个用户并发访问时候, 彼此不会产生影响
Durability 持久性: 是指事物一旦被提交, 他对数据库的改变时永久性的.
4. 事物的操作
A:mysql 事物操作
开启事物 start transaction
提交事物 commit
回滚事物 rollback
注: 事物只有回滚或者提交时才会执行
mysql 中有两种方式管理事物
1) 手动提交
- start transaction;
- sql语句操作数据库;
- commit;
2) 自动提交
- set autocommit = 0; ---- 0 :off 1:on
B:jdbc 事物操作 --- 通过 Connection 对象方法操作
开启事物: connection 对象. setAutoCommit=false;
提交事物: connectin 对象. commit();
回滚事物: connection 对象. rollback();
注: 通畅将事物操作的代码放到 try catch 中, 当异常发生时回滚事物
C:DBUtils 操作事物
开启事物: conn.setAutoCommit=false
提交事物: DBUtils.commitAndClose(conn)
回滚事物: DBUtils.rollbackAndClose(conn)
注: new Query() 时, 不传递参数
5. 并发访问问题及解决方式
并发访问问题:
脏读: 事物 A 读取到事物 B 为提价的数据
不可重复读: 事物 A 还未提交时, 但事物 B 已经提交改变了数据库时, A 重复读数据库的数据为事物 B 修改后的数据 (因为事物 A 未提交数据, 它重复读取数据时应该为开启事物时数据)
虚读 / 幻读: 于不可重复读相似. 更侧重于读取的数据不一致.
解决方式: ---- 设置数据库的隔离级别
1.read uncommitted 读未提交;
2.read committed 读已提交: 可解决脏读问题
3.repeatable read 可重复度: 可解决问题 脏读和不可重复读
4.serializable 串行化 同时只能执行一个事物, 相当于事物中的单线程
安全性能对比:
安全:
serializable > repeatable read > read committed > read uncommitted
性能;
serializable < repeatable read < read committed < read uncommitted
##### 常见的查询操作
cmd 命令查询当前事物的隔离等级: select @@tx_isolation;
设置当前事物的隔离等级: set session transaction isolation level 隔离等级;
查看当前是否为自动提交: show variables like '%commit%';
Java 事物基础总结
来源: http://www.bubuko.com/infodetail-2021523.html