mysql 之事务
mysql 之事务
在处理并发读或者写的时候,可以通过实现一个由两种类型的锁组成的锁系统来解决问题,共享锁和排他锁,也叫读锁和写锁
读锁是共享的,相互不阻塞。多个客户在同一时刻可以同时读取同一个资源,互不干扰
写锁是排他的,一个写锁会阻塞其他的写锁和读锁。
按照锁的粒度分为表锁和行锁
表锁是锁住整张表
行锁只在存储引擎层实现,mysql 服务器层没有实现。
事务的四个特性:
原子性(atomicity):一个事务必须被视为不可分割的最小单元,整个事物的所有操作要么全部提交,要么全部失败回滚
一致性(consistency):数据库从一个一致性状态转换到另一个一致性状态,不会出现错账丢账等。。
隔离性(isolation):一个事务所做的修改在最终提交之前,对其他事务是不可见的
持久性(durability):一旦事务提交,所做的修改都会保存到数据库中。
事务的隔离级别:
读未提交:事务修改没有提交,对其他事务是可见的。**事务可以读取未提交的数据称为脏读。**一般这种隔离级别很少用
读已提交:事务从开始到提交之前,所做的修改对其他事务是不可见的。同一事务下执行两次查询,另一个事务对数据修改提交事务前后,该事务查询可能得到的结果不同,这种状况叫不可重复读。
可重复读:通过 MVCC 解决不可重复读问题,MVCC 记录每行数据的版本,整个事务读取整个版本的数据,实现可重复读,在读的时候不加锁,读写,写读同时进行,写写的时候阻塞。**所谓幻读,指的是当某个事务在读某个范围内的记录时,另一个事务插入一条数据,产生幻行。**利用间隙锁来解决幻读的问题。可重复读是 Mysql 默认事务隔离级别。
串行化:强制事务串行执行,在读取的每一行数据上都加锁,可能导致大量的超时和锁竞争,一般不用。
版权声明: 本文为 InfoQ 作者【周杰伦本人】的原创文章。
原文链接:【http://xie.infoq.cn/article/c0ba6d75d6fa61c153b9fdaaa】。文章转载请联系作者。
评论