范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

大型项目技术栈之日志与性能监控

  一、事务管理策略什么是事务?
  事务是逻辑上的一组操作,要么都执行,要么都不执行。
  事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都要失败。事物的四大特性(ACID)介绍一下?
  原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;一致性: 执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的;隔离性: 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;持久性: 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。并发事务带来哪些问题?
  在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对统一数据进行操作)。并发虽然是必须的,但可能会导致以下的问题:脏读(Dirty read): 当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是"脏数据",依据"脏数据"所做的操作可能是不正确的。
  不可重复读(Unrepeatableread): 指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。
  幻读(Phantom read): 幻读与不可重复读类似。它发生在一个事务(T1)插入了几行数据,接着另一个并发事务(T2)读取了一些数据时。T1删除了一些数据,第二个事务T2在随后的查询中,就会发现少了一些原本存在的记录,就好像发生了幻觉一样,所以称为幻读。
  不可重复度和幻读区别:
  不可重复读的重点是修改,幻读的重点在于新增或者删除。
  例1(同样的条件, 你读取过的数据, 再次读取出来发现值不一样了 ):事务1中的A先生读取自己的工资为 1000的操作还没完成,事务2中的B先生就修改了A的工资为2000,导 致A再读自己的工资时工资变为 2000;这就是不可重复读。
  例2(同样的条件, 第1次和第2次读出来的记录数不一样 ):假某工资单表中工资大于3000的有4人,事务1读取了所有工资大于3000的人,共查到4条记录,这时事务2 又插入了一条工资大于3000的记录,事务1再次读取时查到的记录就变为了5条,这样就导致了幻读。事务隔离级别有哪些?MySQL的默认隔离级别是?
  SQL 标准定义了四个隔离级别:READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。SERIALIZABLE(可串行化): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
  MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读)。我们可以通过SELECT @@tx_isolation;命令来查看show variables;#查看所有数据库变量 select @@tx_isolation;#检索变量tx_isolation的值   @@表示检索变量
  这里需要注意的是:与 SQL 标准不同的地方在于InnoDB 存储引擎在 **REPEATABLE-READ(可重读)事务隔离级别下使用的是Next-Key Lock 锁算法,因此可以避免幻读的产生,这与其他数据库系统(如 SQL Server)是不同的。所以说InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读) 已经可以完全保证事务的隔离性要求,即达到了 SQL标准的SERIALIZABLE(可串行化)**隔离级别。模拟脏读
  打开mysql客户端A,查看隔离级别
  客户端A设置事务隔离级别
  客户端B设置事务隔离级别
  客户端A关闭事务自动提交,开启事务
  客户端B关闭事务自动提交,开启事务
  客户端A查询一条记录
  客户端B修改该记录
  客户端A再次查询该记录,出现脏读:
  二、druid性能监控1.Druid的监控统计功能页面效果
  2.1.打开监控功能
  Druid内置提供一个StatFilter,用于统计监控信息。
  (参考文档:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatFilter)2.1.1. 别名配置
  StatFilter的别名是stat,这个别名映射配置信息保存在druid-xxx.jar!/META-INF/druid-filter.properties。
  在spring中使用别名配置方式如下://如果Properties文件的属性名命名符合configFromPropety的参数Properties的命名规则,则自动赋值 @Bean public DruidDataSource getDataSource(){     Properties props = new Properties();     try {         props.load(SpringMybatisConfig.class.getClassLoader().getResourceAsStream("db.properties"));         DruidDataSource dataSource = new DruidDataSource();         dataSource.configFromPropety(props);         dataSource.setFilters("stat");//配置默认监控filter         return dataSource;     } catch (IOException e) {         e.printStackTrace();     } catch (SQLException e) {         e.printStackTrace();     }     return null; }2.1.2. 组合配置
  StatFilter可以和其他的Filter配置使用,比如://如果Properties文件的属性名命名符合configFromPropety的参数Properties的命名规则,则自动赋值 @Bean public DruidDataSource getDataSource(){     Properties props = new Properties();     try {         props.load(SpringMybatisConfig.class.getClassLoader().getResourceAsStream("db.properties"));         DruidDataSource dataSource = new DruidDataSource();         dataSource.configFromPropety(props);         dataSource.setFilters("stat,wall,slf4j");         dataSource.setConnectionProperties("druid.stat.mergeSql=true;druid.stat.slowSqlMillis=1000");//开启慢sql监控,大于1000毫秒的为慢sql,默认是3秒         return dataSource;     } catch (IOException e) {         e.printStackTrace();     } catch (SQLException e) {         e.printStackTrace();     }     return null; }
  在上面的配置中,StatFilter和WallFilter、SlfFilter组合使用。
  WallFilter:防止sql注入的过滤器
  (参考文档:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE-wallfilter)
  Slf4jFileter:日志记录JDBC执行的SQL
  (参考文档:https://github.com/alibaba/druid/wiki/配置_LogFilter)2.2使用Druid的内置监控页面
  要访问druid的内置监控页面,需要配置一个servlet(参考文档:https://github.com/alibaba/druid/wiki/配置_StatViewServlet配置)@WebServlet(urlPatterns = "/druid/*",initParams = {         @WebInitParam(name="allow",value = ""),//ip白名单,没有配置或空,则允许所有访问         @WebInitParam(name="deny",value = ""),//ip黑名单         @WebInitParam(name = "loginUsername",value = "admin"),//用户名         @WebInitParam(name="loginPassword",value = "123456"),//密码         @WebInitParam(name="resetEnable",value="false")//禁用html页面的reset all功能 }) public class DruidStatueServlet extends StatViewServlet {      }
  或者在spring配置类中:/**     * 注册一个StatViewServlet     *     * @return     */    @Bean    public ServletRegistrationBean druidServlet() {        ServletRegistrationBean reg = new ServletRegistrationBean();        reg.setServlet(new StatViewServlet());        reg.addUrlMappings(new String[]{"/druid/*"});        //IP白名单 (没有配置或者为空,则允许所有访问)        reg.addInitParameter("allow", "");        //是否能够重置数据        reg.addInitParameter("resetEnable", "false");        //设置账号密码        reg.addInitParameter("loginUsername", "admin");        reg.addInitParameter("loginPassword", "123456");        return reg;    }
  开启后即可以启动服务器,并且通过地址栏访问监控页面,访问规则:
  ip:端口号/应用名/druid/login.html
  输入上一步设置的账户密码即可登录3.设置web监控
  WebStatFilter用于采集web-jdbc关联监控的数据(参考文档:https://github.com/alibaba/druid/wiki/配置_配置WebStatFilter)@WebFilter(filterName = "druidStatueFilter",urlPatterns = "/*",         initParams = {         @WebInitParam(name="exclusions",value = "*.js,*.jpg,*.png,*.css,/druid/*"),         @WebInitParam(name="profileEnable",value = "true") }) public class DruidStatueFilter extends WebStatFilter {  }
  或者在spring配置类中:/**      * 注册一个:filterRegistrationBean      *      * @return      */     @Bean     public FilterRegistrationBean filterRegistrationBean() {         FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();         filterRegistrationBean.setFilter(new WebStatFilter());         //添加过滤规则         filterRegistrationBean.addUrlPatterns(new String[]{"/*"});         //添加需要忽略的格式信息         filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");         filterRegistrationBean.addInitParameter("profileEnable", "true");//配置profileEnable能够监控单个url调用的sql列表         filterRegistrationBean.addInitParameter("principalCookieName", "USER_COOKIE");//如果你的user信息保存在cookie中,你可以配置 //principalCookieName,使得druid知道当前的user是谁  USER_COOKIE为cookie名         filterRegistrationBean.addInitParameter("principalSessionName", "USER_SESSION");//使得druid能够知道当前的session的用户是谁         filterRegistrationBean.addInitParameter("DruidWebStatFilter", "/*");         return filterRegistrationBean;     }4.设置spring监控@Bean(name="druidStatInterceptor")//设置druid 的 aop切面类 public DruidStatInterceptor getDruidStatInterceptor(){     DruidStatInterceptor druidStatInterceptor = new DruidStatInterceptor();      return druidStatInterceptor; }   @Bean//配置spring监控 public BeanNameAutoProxyCreator getAutoProxyCreator(){     BeanNameAutoProxyCreator beanNameAutoProxyCreator = new BeanNameAutoProxyCreator();     beanNameAutoProxyCreator.setProxyTargetClass(true);     beanNameAutoProxyCreator.setBeanNames(new String[]{"*Mapper","*Service"});     beanNameAutoProxyCreator.setInterceptorNames("druidStatInterceptor");     return beanNameAutoProxyCreator; }

性能升级,加量不加价,米家新品充气宝1S轻松解决气量不足小烦恼自从有了爱车,相应的车载配件入手的也多了起来,除了行车记录仪车载香薰等等之外,还入手了一些多场景使用的小工具,比如应急启动电源米家的充气宝等产品。就拿米家这款充气宝来说,简直太方便moto高颜值新机曝光天玑900,既轻又薄还有1亿像素主摄结合业内近期的诸多消息可知,平静的6月过后,手机行业接下来的78月份又将迎来新一轮的新机潮,vivoOPPO以及小米等似乎都有新机计划。此外,motorola摩托罗拉似乎有意参与其米粉快来看!小米12系列有望首发2亿像素主摄据7月7日消息,小米正在内测一款2亿像素的全新机型。如果一切顺利,那么小米将成为全球首发2亿像素镜头的品牌!小米CC9Pro曾实现过全球首发1亿像素镜头(ISOCELLHMX),不蓝厂S10系列上架,渲染图曝光,1亿像素后摄此前,vivo在官方宣布将于7月15日发布vivoS10系列新机,而且代言人阵容颇为强大,会由熟悉的蔡徐坤Lisa和刘昊然组成,整机的设计延续着X60系列的水准。目前,该机已经上架一加Nord2搭载骁龙87012GB256GB配置7月24首发如果谈到性价比高的手机,不少人回想到红米K40,该机凭借着骁龙870芯片120Hz高刷三星E4屏,索尼4800万三摄等亮点广受消费者欢迎,其实还有一款手机也是有着较高性价比的,也有3000元以上手机性价比排名小米9第二,荣耀V20上榜近日,根据多家科技媒体的消息,国内手机评测机构安兔兔公布了2019年5月份3000元以上手机性价比排名。对于国内智能手机市场来说,售价超过3000元的机型,已经属于高端手机的范围了小米有心了全新黑科技让廉价千元机也能用上屏下镜头完美全屏历史上手机外观的创新一般都是大厂,但也有一次例外,那就是2016年小米推出的小米MIX一代。该机首创了三面无边框的全新外观形态,并且雷军还给它起了一个完全影响之后手机外观潮流的名字苹果大突破,TouchID内置电源按钮,iPhoneSEPlus终于要翻身了在人手一部智能手机的刚需背景下,随着科技的进步,各大手机厂商在智能手机的设计上也是不断创新突破,其实真正有创新能力的手机厂商也并不多,我们知道,苹果公司的产品在创新突破方面,引领着何为6400万超级防抖全场景影像系统?魅族18iPhone12没有的我有2021年提及小屏旗舰,可能大家最快想到的就是iPhone12mini,因为它很容易让人想到一句话和老大哥平齐平坐,和iPhone12同样的A14处理器,相同的超视网膜XDR屏幕,Intel请回镇宅女神意欲重整河山英特尔公司宣布,随着首席执行官帕特盖尔辛格(PatGelsinger)继续重建公司的工程名册,它将请回另一位著名的芯片架构师,拥有28年经验的什洛米特魏斯(ShlomitWeissvivoS10系列7月15日即将见面,实力过人获三大顶流代言众所周知,vivoS系列作为vivo一直深受消费者喜爱的产品,主打美颜自拍和轻薄设计,就在今天,vivo官宣了备受关注的新产品vivoS10系列,与此同时,还官宣了此次新品手机的代
外交部美国不惜分裂互联网企图用小圈子取代多边5月6日,外交部发言人赵立坚主持例行记者会。针对美高官频繁渲染中国网络威胁,赵立坚表示,美国官员出于政治目的发表与事实不符的言论,中方对此坚决反对。赵立坚表示,实际上,为了保持自己警告!美国又现一新变异株,比奥密克戎传播还要快3成疫情较严峻。奥密克戎各种变异株层出不穷,在全球范围内广泛传播,造成全球新增新冠病例人数再度上升。奥密克戎新亚型BA。2。12。1在美国已经发现多例感染的患者。美国疾病控制和预防中心马斯克有可能成为下任美国总统,这可不是危言耸听2018年模拟五角大楼攻击中,他的芯片卫星成功拦截350枚,全部的洲际导弹攻击,所以美国政府一直在为他打掩护。最近他又以438亿美元成功收购了推特,也就是美国的微博,他现在已经从通为什么要使用lambda表达式?原来如此,涨知识了为什么要使用Lambda表达式先看几段Java8以前经常会遇到的代码创建线程并启动创建线程publicclassWorkerimplementsRunnableOverridepu易周金融观点支付机构入局数字藏品Q1手机银行交易超150万亿易观分析数字经济全景白皮书浓缩了易观分析对于数字经济各行业经验和数据的积累,并结合数字时代企业的实际业务和未来面临的挑战,以及数字技术的创新突破等因素,最终从数字经济发展大势以及各消息人士印方图谋已久!印度执法机构冻结中企550亿巨额资金近日,印度政府以违反印度外汇管制法律为借口,将中国科技公司小米在印度的分公司五百五十五亿卢比的资金(约合人民币四十八亿元)冻结。而小米公司则发布声明称,该公司在印度一直坚持合法经营8。0。22最新版安卓微信性能检测工具作用及位置前两天,小编为大家介绍过了关于8。0。22最新版安卓微信新增加的功能以及这个最新版本带来的更新内容了。而在8。0。22最新版安卓微信当中,微信带来了好几个新功能,包括全新的清理缓存比亚迪和特斯拉两者的估值和发展路径是很不一样的给你们几个数据看看吧,2021年全球纯电动车销量超过了混动车,其中最大的推手就是来自中国市场。去年,中国市场纯电动车销售了273万辆,插电车销量60万辆。纯电车的同比增速是174,Redis早期的主从架构原理分析,早期如何实现读写分离的?1强制读写分离基于主从复制架构,实现读写分离,redisslavenode节点只读,默认开启配置slavereadonlyyes。开启了只读的节点redisslavenode,会拒Wintersmith入门基于Node。js的静态站点生成器Wintersmith基于Node。js和npm的好处之一是安装过程非常简单。您必须执行以下命令来安装它(注意sudo在Windows上不是必需的)sudonpminstallgw构建国际首个肉牛组织基因表达图谱近日,中国农科院北京畜牧兽医研究所牛遗传育种科技创新团队成功构建了国际首个肉牛高质量组织基因表达图谱。该图谱具有组织涵盖广分辨率高及可参照性强等优点,为新基因挖掘及功能验证提供了重