事务是什么
一个大的处理单元,包含多项操作,涉及多次cpu和io操作,这些操作同时完成或同时不完成,即这个大的处理单元中的操作是一个整体,只有全部执行完毕,才进行提交。一般启动事务的是SQL语句,或是ODBC中专门启动事务的语句
事务的性质(应遵循的规则,ACID)
原子性(Atomicity):整个事务中的所有操作,要么全部完成,要么全部不完成,不能停滞在中间某个环节,整个事务的所有操作是不可分割的,所以事务在执行过程中若发生错误,应回滚到事务开始前的状态,就像这个事务从来没有执行过一样
一致性(Consistency):事务执行必定会引起数据库状态改变,一致性表示,事务开始到事务结束,数据库的整体状态是没有改变的
隔离性(Isolation):事务并行执行时,确保每一事务在系统中认为只有该事务在使用系统,事务彼此间互不影响
持久性(Durability):在事务完成以后,该事务所对数据库所作的更改会持久的保存在数据库之中,通过写入日志文件当中
事务日志:
事务记录到事务日志文件中,最后再写入磁盘中(例如DELECT操作,有四个语句,四个语句执行都是在内存中完成,并且先记录到日志中,当整个操作完成,再从日志文件对数据文件进行修改)所以每个事务执行过程中都要写入两遍,一遍到日志,一遍到真实文件(日志记录的是操作过程,而非操作本身)
事务并发执行时需要进行并发控制,加锁是其中一种方式,也是一种重要的机制
锁分类
读锁:共享锁(读的同时允许其他事务读)
写锁:独占锁/排它锁(写的同时不允许其他事务读和写)
锁粒度:锁粒度从大到小,粒度越细越能实现并发性,但实现机制越复杂
(mysql server仅支持表级锁,行锁需要存储引擎完成)
表锁
行锁
隔离级别:由低到高,隔离级别越高,并发能力越低
READ UNCOMMITTED:读未提交:所有事务都可以看到其他事务操作结果,各种混乱
READ COMMITTED:读提交:事务在其他事务操作完提交后,才能看到其他事务的操作(我读了一次,再次读的时候已经被别人提交了,两次读的不一样)
REPATABLE READ:可重读:事务第一次读到什么,一直到提交的时候都是那样,即使其他事务在这个过程中对相同的内容操作并提交,也不会改变本事务读到的东西(提交后发现应该是10行现在变成了5行,可能别人在你没提交的时候修改并提交了)(mysql默认)
SERIALIZABLE:可串行,简单地说,事务不可同时执行
本文出自 “Call me Boxin” 博客,请务必保留此出处http://boxinknown.blog.51cto.com/10435935/1677013
原文地址:http://boxinknown.blog.51cto.com/10435935/1677013