technology-note/数据库/数据库事务四个特性及隔离级别.md
2018-11-09 23:29:10 +08:00

46 lines
3.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[id]: 912d2fd0d6c111e8aa858b6a40460626
## 一、 数据库事务四大特性ACID
### 1、 原子性Atomicity
  原子性是指事务包含的所有操作要么全部执行成功,否则失败回滚,回到未执行事务前的状态。
### 2、一致性Consistency
  一致性是指事务必须使数据库从一个一致性状态变成另一个一致性状态,也就是事务执行前后必须处于一致性状态。
  以转账为例假设用户A和B两者的钱加起来是5000那么不管A和B之间如何转账转多少次事务结束后两个用户的钱加起来应该还得是5000这就是事务的一致性。
### 3、 隔离性Isolation
  隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其它的事务操作所干扰,多个并发事务之间要相互隔离。
  既要达到这么一种效果对于任意的两个并发的事务T1和T2它们相互之间感觉不到对方正在并发的执行关于事务的隔离性数据库提供了多种隔离级别假设我们不考虑隔离性会发生什么问题呢
- 脏读
在一个事务中对数据做了修改,但还未提交,这是其他人读取这个数据,得到的是修改后的值,一旦事务回滚了,再次读取时发现值又变了。
- 不可重复读
不可重复读是在对数据库中的某个数据重复查询时,返回了不同的查询结果,这是由于在查询期间,被另一个事物修改并提交了。和脏读的区别是脏读读取的是另一个事物未提交的脏数据,不可重复读读取的是前一事物已提交的数据。通常情况下不可重复读并不是问题。
- 幻读(虚读)
幻读是事物非独立执行时发生的一种现象例如事物T1对一个表中所有的行的某个数据设置为了1这时还有一个其他操作向该表中插入了一行数据并且数据不为1如果操作T1的用户查看刚刚修改的数据就会发现还有一行没有修改其实这行是在修改操作完毕后新加入的一条数据。
### 4、 持久性
  持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即使在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
   例如我们在使用jdbc操作数据库时在提交事务方法成功后就可以认定事务已经被正确提交即使数据发生重大故障操作也会正确完成。
## 二、 四种隔离级别
  Mysql数据库提供了四种数据库的隔离级别
1. Serializable(串行化):对表加了读写锁,每次读写都需要获取共享锁,丧失了并发速度,可避免脏读,不可重复读,幻读的发生
2. Repeatable read(可重复读):在同一个事务内的查询都是事务开始时刻一致的,可避免脏读、不可重复读的发生
3. Read committed(读已提交):只能读取到已经提交的数据,避免了脏读的发生。
4. Read uncommitted(读未提交):所有都能读取到,啥都无法避免
  Mysql默认的事务隔离级别是2。