用户正常断开连接时,事务自动提交
系统崩溃或断电时,事务自动回滚
事务的四个特性:ACID
原子性Atomic:不可分割,一个操作集合要么全部成功,要么全部失败
一致性Consistent:最终是为了保证数据的一致性(存取钱)
隔离性Isolation:各个事务之间相互不会产生影响,严格的隔离性会导致效率降低,在某些情况下为了提高效率需要降低隔离级别,mysql默认隔离级别是可重复读,(mysql只支持可重复读和serializable出自开课吧)
持久性Durable
隔离级别:
读未提交 read uncommitted
读已提交 read committed
可重复读 repeatable read
序列化 serializable
产生数据不一致的情况
脏读
不可重复读
幻读
隔离级别 脏读 不可重复读 幻读
读未提交 √ √ √
读已提交 × √ √
可重复读 × × √
序列化 × × ×
脏读:a事务修改数据后没有commit b事务读取到修改后的数据
不可重复读:b查询数据为1 a修改数据commit后 b查询的数据为2 同一事务中读取到数据不一致
例如取钱:账户1000 取款500 取款过程中别人转账五千 此时取款后余额5500是不对的
脏读:a事务插入数据4commit后 b事务查询数据没有4 但是b事务插入数据4报主键重复错误
持久化:所有数据的修改都必须要持久化到存储介质中,不会因为应用程序的关闭而导致数据丢失
四个特性中,哪个是最关键的?
所有特性都是为了保证数据的一致性,所以一致性是最终的追求
事务中的一致性是通过原子性,隔离性,持久性来保证的
锁的机制:
为了解决并发访问的时候,数据不一致的问题,需要给数据加锁,加锁的同时需要考虑粒度的问题
操作的对象:数据库,表,行
一般情况下,锁的粒度越小,效率越高,大部分都是行级锁
三范式是为了减少数据冗余,比如表里需要存储cd,而不是name,cd占空间小
- 列不可分
- 不存在部分依赖(联合主键或者对照表)确保表中每一列都和主键相关
- 不存在传递依赖 确保表中每一列都和主键直接关联而不是间接关联