关闭

mysql并发基础知识

标签: 事务隔离级别并发javamysql
265人阅读 评论(0) 收藏 举报
分类:

本文章来源于 [ mysql中不同事务隔离级别下数据的显示效果 ]

  • 事务
  • 事务的状态
  • 事务并发导致的问题
  • 并发控制
  • 事务的四种隔离级别
  • 总结

事务

事务是一组原子性的SQL查询语句,也可以被看做一个工作单元。如果数据库引擎能够成功地对数据库应用所有的查询语句,它就会执行所有查询,如果任何一条查询语句因为崩溃或其他原因而无法执行,那么所有的语句就都不会执行。也就是说,事务内的语句要么全部执行,要么一句也不执行。
  事务的特性:acid,也称为事务的四个测试(原子性,一致性,隔离性,持久性)
  
  automicity:原子性,事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做。
  
  consisitency:一致性, 事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
  
  isolation:隔离性, 一个事务的执行不能被其他事务干扰。
  
  durability:持久性,一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
 

事务的状态 

  事务的状态:
  活动
  部分提交
  失败
  中止
  提交
  事务在某一时刻,一定处于上边五种状态中的一种。
  

事务并发导致的问题

脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。
  不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新了原有的数据。
  幻读(Phantom Read):在一个事务的两次查询中数据不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。

并发控制

  每个用户操作数据时都是源数据的时间快照,当用户操作完成后,依据各快照的时间点在合并到源数据中
  锁:要想实现并发控制,最简单的实现机制就是锁(MVCC采用的不是锁机制)。
  读锁:共享锁,由读表操作加上的锁,加锁后其他用户只能获取该表或行的共享锁,不能获取排它锁,也就是说只能读不能写
  写锁:独占锁,由写表操作加上的锁,加锁后其他用户不能获取该表或行的任何锁
  锁粒度:从大到小,MySQL服务器仅支持表级锁,行锁需要存储引擎完成。
  表锁:锁定某个表
  页锁:锁定某个页
  行锁:锁定某行
  粒度越精细,并发性越好。即行锁的并发性最好,但需要存储引擎的支持。

事务的四种隔离级别

  读未提交(read uncommitted): 允许脏读,也就是可能读取到其他会话中未提交事务修改的数据
  读提交(read committed): 只能读取到已经提交的数据。oracle等多数数据库默认都是该级别
  可重读(repeatable read): 在同一个事务内的查询都是事务开始时刻一致的,innodb的默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读
  可串行(serializable): 完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞
  在MySQL中,在并发控制情况下,不同隔离级别分别有可能产生问题如下所示:

隔离级别 脏读 不可重复读 幻读
读未提交(read uncommitted) T T T
读提交(read committed) F T T
可重读(repeatable read) F F T
可串行(serializable) F F F

总结

  当有多个事务并发执行时,虽然会产生很多问题,如脏读、不可重复读、幻读等现象,但事务的并发性较好,可同时执行多个事务;在高隔离级别下,当有多个事务并发执行时,因在高隔离级别下,不支持多事务并发执行,虽然不会出现诸如脏读、不可重复读及幻读等现象,但并发性较低。InnoDB默认的隔离级别是repeatable-read(可重读),而在大多数的数据库中,oracle等多数数据库,一般默认的隔离级别是read-committed(读提交)。一般来说在实际应用中,除了在银行、股票等对数据安全要求较高的场景外,必须使用较高隔离级别外,其他对数据要求不高的场合,可采用低隔离级别,以提高并发性。然而,究竟哪种隔离级别更适合,那就需要看你对数据的安全性要求有多高了。

推荐一篇相关文章:Spring 使用注解方式进行事务管理

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:49534次
    • 积分:1072
    • 等级:
    • 排名:千里之外
    • 原创:58篇
    • 转载:9篇
    • 译文:0篇
    • 评论:4条
    最新评论