什么是事务?
事务是数据库并发控制的基本单位
事务可以看作是一系列的SQL语句集合
事务必须要么全部执行成功,要么全部执行失败(回滚)
事务的ACID特性
ACID是事务的四个基本特性
原子性(Atomicity):一个事务中所有操作全部完成或者失败
一致性(Consistency):事务开始和结束之后数据完整性没有被破坏
隔离性(Isolation):允许多个事务同时对数据库修改和读写
持久性(Durability):事务结束之后,修改是永久的不会丢失
事务的并发控制可能产生哪些问题
如果不多事务进行并发控制,可能会产生四种异常情况
幻读:一个事务第二次查出现第一次没有的结果
非重复读:一个事务重复读两次得到不同的结果
脏读:一个事务读取到另外一哥事务没有提交的修改
丢失修改:并发写入造成其中一些修改丢失
四种事务隔离级别
为了解决并发控制异常,定义了四种事务隔离级别
读未提交:别的事务可以读取到未提交改变
读已提交:只能读取已经提交的数据
可重复读:同一个事务先后查询结果一样
串行化:事务完全串行化的执行,隔离级别最高,执行效率最低
如何解决高并发场景下的插入重复
高并发场景下,写入数据库会有数据重复问题
使用数据库的唯一索引
使用队列异步写入
使用redis实现分布式锁
什么是乐观锁,什么是悲观锁
悲观锁是先获取锁再进行操作,一锁二查三更新select for update
悲观锁先修改,更新的时候发现数据已经变了就回滚(check and set)
乐观锁一把通过版本号或者时间戳实现
使用需要根据响应速度,冲突频率,重试代价来判断使用哪一种锁