数据库事务的特性:ACID:原子性,一致性,隔离性,持久性。
原子性:事务的操作是一个原子性操作,要么全做,要么全部做
一致性:执行事务前后,数据保持一致,多个事务对同一个数据库读取的结果是相同的.数据库从一个一致性状态到另一个一致性状态
隔离性:多个事务对数据库进行操作时,保证每个事务之间没有影响
持久性:修改完数据库是永久的。
保证ACIDs属性的方法:(1)并发控制(2)日志恢复
(1)并发控制:
a.乐观并发控制(当事务出现问题时才解决:回滚)
b.悲观并发控制(事务开始时就加锁、时间戳)。
- MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ (可重读).
- 与 SQL 标准不同的地方在于InnoDB 存储引擎在 REPEATABLE-READ(可重读)事务隔离级别下使用的是Next-Key Lock 锁算法,因此可以避免幻读的产生
并发事务带来的问题:
脏读:插入了一条语句,但是没有提交,我再select的时候,却显示出来了。
不可重复读:我在查询一个属性值之后(select * from student where id=‘111’),你update了这个属性值,我由查询了一次,结构两次读的结果不一样,就是不可重复读。
幻读:我查询了该列表的所有属性值(select * from student),你又插入或删除了(insert \ delete)几个元组,我再查询的时候,发现列表变了
数据库隔离级别有四种:未提交,提交,可重复读,串行化
读未提交:没有提交的事务,也能读到。会出现脏读、不可重复读、幻读
读提交:只有提交的事务,我才能读到。可以避免脏读,但是会出现不可重复读,幻读。
可重复读:当进入查询状态时,不允许对数据库进行update操作。可以避免脏读、不可重复读,但是会出现幻读。
串行化:每条指令按照指定的顺序执行,可以避免脏读,不可重复读,幻读。但是代价太大。
锁:
- 共享锁:A加了共享锁后,只能再对A加共享锁
- 排他锁:A加了排他锁后,不能再对A加任何锁
时间戳:
核心思想:对与并发发生冲突时,按照时间戳的顺序选择一些事务继续执行,一些事务回滚。
先开始事务的时间戳<后开始事务的时间戳
数据库事务隔离:当多个事务同时访问数据库时,能保证每个事务之间相互没有影响。