您的位置:首页 > 数据库 > MySQL

Mysql事务以及加锁机制

2015-12-20 20:11 639 查看
事务的特征ACID,即原子性、一致性、隔离性、持久性。

原子性保证一个事务为一个最小的单元,内部不可分割;

一致性保证事务中的每个操作线程不可单独提交,成功则一起提交,不成功则事务回滚;

隔离性保证不同事务间看到的数据视图相互独立,相互隔离(隔离级别可设置);

持久性保证事务提交后数据会持久的保存下来;

sql规范定义的事务的隔离级别:

1.READ UNCOMMITTED(读取未提交内容)

所有事务可以看到未提交事务的执行结果,本隔离级别很少用到实际应用中,读取未提交的数据,又称为“脏读”。

2.READ COMMITTED(读取提交内容)

大多数数据库的默认隔离级别是此级别,但不是mysql默认的。一个事务在开始的时候只能看见已提交事务所做的改变。一个事务从开始到提交前所做的任何改变都是不可见的,除非提交。这种隔离级别也称为不可重复读。

3.REPEATABLE READ(可重复读)

锁定查询中使用的所有数据以防止其他用户更新数据,但是其他用户可以将新的幻像行插入数据集,且幻像行包括在当前事务的后续读取中。此级别也称为“幻读”。

4.SERIALIZABLE(可串行化)

可串行化是最高的隔离级别,它通过强制事务排序,使之不可重读,解决了幻读的问题。此隔离级别会在每个读的数据行上加共享锁,使用这种隔离级别会产生大量的超时现象,一般实际开发中不会用到。

mysql加锁机制 :

根据类型可分为共享锁(SHARED LOCK)和排他锁(EXCLUSIVE LOCK)或者叫读锁(READ LOCK)和写锁(WRITE LOCK)。

根据粒度划分又分表锁和行锁。表锁由数据库服务器实现,行锁由存储引擎实现。

mysql提供了3种事务型存储引擎,InnDB、NDB Cluster和Falcon。

一个事务执行的任何过程中都可以获得锁,但是只有事务提交或回滚的时候才释放这些锁。这些都是隐式锁定,也可以显式锁定,InnoDB支持显式锁定,例如:

SELECT .... LOCK IN SHARE MODE (加共享锁)

SELECT .....FOR UPDATE(加排他锁)

多版本并发控制(重要):

Mysql的事务存储引擎不是简单实用行加锁机制,而是叫多版本并发控制(MVCC)技术,和行加锁机制关联实用。以便应对更高的并发,当然是以消耗性能作为代价。

每种存储引擎对MVCC的实现方式不同,InnoDB引擎的简单实现方式如下:

InnoDB通过为每个数据航增加两个隐含值的方式来实现。这两个隐含值记录了行的创建时间,以及过期时间。每一行存储事件发生时的系统版本号。每一次开始一个新事务时版本号会自动加1,每个事务都会保存开始时的版本号,每个查询根据事务的版本号来查询结果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: