首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

事务隔离与更改数据库的关系

马克-to-win:当 然,为了保持数据的一致性和数据库的正确性,涉及到同时改变数据库(update,insert,delete)时,不管任何的隔离级别,事务一定是序列 的执行的。先执行的事务挡住(block)后执行的事务正好要改变数据库的那句话(换句话说,在那句话后面的事务就卡在那了)。后执行的事务需要获得相关 行的“行排他锁”才能改数据。先执行的,一定是事务完成才释放“行排他锁”。注意不止是那句更新完成就释放“行排他锁”。马克-to-win:先执行的事务一完成,后面的事务 立刻继续。注意二者都commit后,对数据库的改变是叠加的。只要commit,改变就不会白做,保证了数据库的正确性。(查事务的ACID的 Durable的特性)比如一个insert,另一个update,效果也叠加,即使update的select时,还看不见insert的东西。只要对 准那个insert的row的主键update,更新就不白做。马克-to-win:两个都update,效果更是叠加了。如果你delete,我看不见,我还update, 就白做了,也好理解,因为你先delete了嘛!具体见“REPEATABLE-READ隔离级别”

01

缓存层如何设计

马克-to-win:我们前面讲过 了n-tier架构。在我们的程序当中,还可以设计一个缓存层。在去访问数据库之前,先看看缓存层中有没有数据,如果没有的话,从数据库取完数据回来,一 定要放在缓存层当中一份,下次就不用去数据库了。马克-to-win:如果对数据库当中,某个数据更新了,同时一定要记住也更新一下缓存当中的数据。这样的话,既保证了缓存的 数据是最新的,也保证了将来查询时不用去查数据库,减轻了对数据库的压力。 这里有些问题,问题1,如果除了你的项目,还有其他的地方可以更改数据库,怎么办?可以做一个守护线程,发现某个表的版本变了,就重新把表的数据加载回你 的缓存。问题2,对于条件查询,如何处理缓存?比如30元到50元的衣服数据的第二页。大家通常的做法是,把整个衣服表都加载到缓存中,无非就是一个 List,之后整个做个遍历,把符合条件的选出来。为什么要整个加载?因为别人还有可能要查20到40块钱的第五页的数据。问题3,项目a处需要看表的 123列,b处需要看表的456列,缓存时就直接把123456列作为一个表缓存起来,供两处使用。马克-to-win:顺便说一句,缓存也可以缓存图片。数据库和图片服务 器,可以认为是大的仓库,什么都能找到,而缓存可以看做是前端的商店,客户经常要买的东西就存一部分在商店,这样可以提高效率。如果商店没有相应的商品, 也不用着急,因为我们后面的仓库肯定有。

00
领券