Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1396085
  • 博文数量: 277
  • 博客积分: 2551
  • 博客等级: 少校
  • 技术积分: 3918
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-21 22:46
文章分类

全部博文(277)

文章存档

2017年(3)

2016年(9)

2015年(65)

2014年(27)

2013年(85)

2012年(61)

2011年(27)

分类: Mysql/postgreSQL

2014-07-19 11:28:03

     有人认为mvcc是行级锁的一个变种,并不是说mysql并不是没有行级锁了,它只是避免了加锁。
mvcc为每个记录行追加了2个列,一个保存了记录的创建时间,也就是insert的插入时间,这个其实是系统的版本号,一个是保存了记录的删除时间,也就是delete的时间。
     目前mvcc只是工作在可重复读和读提交2个隔离级别工作。
     mvcc要求在select数据的时候,只查找记录的创建系统版本号小于或者等于当前的事务版本号而且行的删除版本号要么未定义要么,要么高于当前的事务版本号即可。
     此时读取数据并未加锁,mvcc实现了各个事务读取数据的独立性,也就是隔离性,但是解决了幻读的问题。可见mvcc是对隔离的一种加强。
     尚不知begin transaction的时候是否要加事务锁,commit的时候是否释放了事务锁,这个事务的锁是否存在? 还有事务的隔离级别为何总是考虑读的问题?
      理解mysql的这些特性的要求,不能以程序员的眼光来看这个问题,数据库对数据的访问方式与程序对数据的访问方式不同,程序访问数据,强调的是多线程访问的安全性,要求所有的线程访问数据几乎要达到串行的要求,也就是数据库的串行化的隔离级别。数据库访问数据是采用事务的方式,也就是说事务就是类似线程一样,但是数据库访问数据更多是强调ACID,有很多关键的特性是普通的程序不具备的,如原子性,回滚。
      在理解数据库的一些特性的时候,是要以它主要用来解决什么问题而出现的这些特性,如存储数据,持久化,这些文件系统也能做到。
      所有普通的数据的并发访问方法,在数据库中同样会遇到,如死锁。
      数据库是一种访问数据的特定的模式,有一定的适用场景。
   

阅读(2827) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~