事务
- Atomic 原子性
操作要么都执行,要么都不执行. - Consistency 一致性
数据不论是否回滚,都要保证一致性 - Isolation 隔离性
事务不能看到其他事务的中间数据 - Durability 持久性
操作一旦发生,其修改时持久的.
事务的并发问题
- 脏读
读取到的是别人未提交的已修改数据,可能回滚 - 不可重复读
两次读取,数据不同 - 幻读
有新插入记录
数据库隔离级别
- 读未提交
- 读提交
解决脏读 - 重复读
解决脏读,不可重复读 - 序列化
全部解决
锁
1.悲观锁
每次拿数据都觉得别人会改,对世界怀着深深的危机感.
所以一拿数据就加锁,别人再想拿就会阻塞在这里.
分为以下几类:
读锁,写锁,行锁,表锁
读锁
也称共享锁(share lock) (S锁)
加锁后只允许读取数据,读取完毕立即释放.
在数据库语句后加holdlock
写锁
又称排他锁 (Exclusive lock) (X锁)
只能由一个事务持有
在数据库语句后加 for update
行锁
当知道更新的是哪几行,数据库就是行锁,
比如指定的更新的主键id
表锁
当不知道更新哪几行,比如指定比较字段可能有多个行满足,就是表锁
2.乐观锁
每次拿数据都很乐观,不加锁,只是在提交的时候看看数据是否发生修改.
版本号方式
比对原来数据