数据库的事务:事务就是单个数据逻辑单元组成的对象操作集合,而数据库终极目标就是是数据库从一个一致的状态转换到另一个一致的状态。
事务的四大特性(ACID):
- 原子性 Atomicity 事物包含的所有数据库操作要么全部成功,要么全部失败回滚
- 一致性 Consistency 一个事务执行前后都必须处于一致性状态
- 隔离性 Isolation 一个事务未提交的业务结果对于其它事务不可见
- 持久性 Durability 一个事务一旦被提交了那么对数据库中数据的改变就是永久性的
数据库中读写时的安全问题:
- 脏读 事务 A 正在使用一个数据但还没有提交,另外一个事务 B 也访问到了这个数据,还使用了这个数据。
- 不可重复读 事务 A 中多次操作一个数据,在这两次或多次访问这个数据的中间,事物 B 也操作此数据,并使其值发生了改变,这就导致同一个事务 A 在两次操作这个数据的时候值不一样,这就是不可重复读。
- 幻读 事务不独立执行产生的一种现象。事务 A 读取与搜索条件相匹配的若干行,事务 B 以插入或删除等方法来修改事务 A 的结果集,然后再提交。这样就会导致 A 本来执行的结果包含 B 执行的结果,这两个本来是不相关的,对于 A 来说相当于产生了幻觉。
数据库的四种隔离级别(并发事务):
- 可读取未提交 Read uncommited 写事务阻止其他写事务,避免了更新遗失。但是没有阻止其他读事务。
- 可读已提交 Read commited 写事物会阻止其他读写事务,读事务不会阻止其他任何事务。
- 可重复读 Repeatable read 读事物会阻止其他写事务,但不会阻止其他读事务。MySql 的默认隔离级别。
- 序列化 Serializable 可避免幻读。读加共享锁,写加排他锁。
这四种隔离级别可以处理的问题有:
参考: