事务

事务就是一组原子性的SQL查询,或者说一个独立的工作单元。事务内的语句,要么全部执行,要么全部执行失败。 可以用START TRANSACTION语句开始一个事务,然后要么用commit提交事务并将修改的数据持久保留,要么用ROLLBACK撤销所有的修改。 # ACID ACID表示原子性、一致性、隔离性和持久性。一个运行良好的事务处理系统,必须具备这些特征。 # 隔离级别 在SQL标准中定义了四中隔离级别。每一种级别都规定了一个事务中所做的修改,哪些是在事务内和事务间是可见的,那些是不可见的。较低级别的隔离通常可以执行更高的并发,系统的开销也更低。 # 死锁 死锁是指两个或者多个事务在同一资源上互相占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。当多个事务试图以不同顺序锁定资源时,就可能会产生死锁。多个事务同时锁定同一个资源时,也会产生死锁。 为了解决问题,数据库系统实现了各种死锁检测和死锁超时机制。越复杂的系统,入InnoDB存储引擎,越能检测到死锁的循环依赖,并立即返回一个错误。In'no'DB目前处理死锁的方法是,将持有最少行级排他锁的事务进行回滚。 锁的行为和顺序是和存储引擎有关的。以同样的顺序执行语句,有些存储引擎会产生死锁,有些不会。死锁的产生有双重原因:有些是因为真正的数据冲突,有些是因为数据引擎的实现方式导致的。 死锁产生后,只有部分或者全部回滚其中一个事务,才能打破死锁。 # 事务日志 事务日志可以帮助提高事务的效率。使用事务日志,存储引擎再修改表的数据时只需要修改其内存拷贝,再将修改行为记录到持久的硬盘上的事务日志中,而不用每次都将修改的数据本身持久到磁盘。事务日志采用的是追加的方式,因此写日志的操作是磁盘上一小块区域内的顺序I/O,而不像随机I/O需要在磁盘的多个地方移动磁头,所以采用事务日志的方式相对来说要快得多。 # MYSQL中的事务 mysql提供两种事务型的搜索引擎:InnoDB和NDB Cluster。另外还有一些第三方存储引擎也支持事务。 ## 自动提交 mysql默认采用自动提交模式。如果不是显式的开始一个事务,则每个查询都被当做一个事务执行提交操作。可以通过设置AUTOCOMMIT变量来启用或者禁用自动提交模式: ``` SET AUTOCOMMIT = 1 ``` 或者ON表示启用,0或者OFF表示禁用。当AUTOCOMMIT=0时,所有的查询都是在一个事务中,直到显式的执行COMMIT提交或者ROLLBACK回滚,该事务结束,同时又开始一个新事务。对于非事务类型的表,没有COMMIT和ROLLBACK这一概念,可以说相当于一直处于AUTOCOMMIT = 1启用的模式。 ## 在事务中混用存储引擎 mysql服务器层不管理事务,事务是由下层的存储引擎实现的。在一个事务中,使用多种存储引擎是不可靠的。