一、数据库的事务
数据库事物有四个特性,①原子性:所有操作要么全部成功,要么全部失败②一致性:事物执行前和执行后都需要保证一致性,也就是从一个一致性状态变到另一个一致性状态,比如A和B之间无论如何转账,总数应该保持一致。③隔离性:一个事务不能被另一个事务干扰。④持久性:一旦事务提交了,那么对数据库中的数据的改变就是永久的。
以上是数据库事务的四大特性;
二、如果不考虑数据库事务的隔离性,会引发的问题
①更新丢失:两个事务同时更新,第二个事务回滚覆盖第一个事务更新的数据
②脏读:读取了另一个未提交事务的数据
③不可重复读:在一个事务范围内,两次查询的结果不一致,和脏读的区别是不可重复读是读取了前一事务提交的数据
④虚读(幻读):修改的数据被其他事务修改回去了并提交,导致后面再次查询的时候发现没有被修改。
三、由此一来Mysql提供的数据库隔离级别
①串行化:隔离级别最高以上四种情况都能避免
②可重复读:可避免以上①②③种问题
③读提交:可避免以上①②问题
④读未提交:可避免以上①问题
那么数据库的隔离级别该怎么设置:在数据库的连接建立是设置conn.setTransactionIsolation(Connection.Transaction_Serializable);并且设置事务开启conn.setAutoCommit(false);
四、mysql存储引擎
①、myisam , inodb , memory , merge四种存储引擎,其中myisam不支持事务也不支持外键,只有memory支持Hash索引
五、Mysql索引
①mysql的索引主要有两种结构B+tree和hash索引,支持hash索引的只有memory存储引擎,也是该存储引擎的默认索引结构。hash索引结构因为是hash散列结构所以当查找某一条数据的时候,速度很快,但是因为hash一个建只对应一个值,所以不支持排序和范围查找
②B+tree索引结构是inodb,Myisam存储引擎的索引结构,支持范围查找和排序,但是单条查询没有hash快
③mysql常见的索引类型有:主键索引(索引值必须唯一且不能为空),唯一索引(索引值必须唯一),普通索引(无限制),全文索引(仅可用于myisam表),组合索引
六、数据库锁有哪些
共享锁,排他锁,更新锁,具体什么时候加锁加什么锁由数据库自行决定,和设置的数据库事务隔离级别有关系
七、一致性hash
一致性hash是将集群中的设备节点和数据映射到一个封闭的环形中,数据通过顺时针空间存放到设备节点。这样的好处是当有一个设备out后,只需将数据考到下一个设备中,如果新增一个设备也只需将拷贝少量的数据到新的设备中。出现问题后,丢失或者不可用的数据尽量做到了最小化
八、Redis为什么的集群模式
Redis通过hash槽而非一致性hash来实现集群模式,
九、怎么通过Redis来实现分布式锁
Redis实现分布式锁的正确方法应该是,通过set设置一个SN值并指定过期时间,避免发生错误没有释放锁时发生死锁,解锁的时候可以通过String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
Object result = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));
这样就可以实现一个分布式锁的加锁和解锁。