-
ACID定义
(1) 原子性
一个事务是一个单独的内部不可分的工作单元
(2) 一致性
数据库总是从一种一致性状态转换到另一种一致性状态
(3) 隔离性
某个事务的结果只有在完成以后才对其他事务可见
(4) 持久性
一旦一个事务提交,事务所做的数据改变将是永久的
事务将导致数据库服务器要完成更多的额外工作
-
隔离级别
(1) 四个隔离级别
1° READ UNCOMMITED
2° READ COMMITED
大多数数据库系统的默认隔离级别(但是不是MySQL的默认隔离级别)
3° REPEATABLE READ
MySQL的默认隔离级别,包括InnoDB、Falcon这两种支持事务的存储引擎,支持的都是这一种
4° SERIALIZABLE
(2) 越高等级的隔离级别,会导致数据安全性越强,但是带来的问题是系统开销更大
(3) MySQL中可以设置隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITED;
MySQL可以识别4个隔离级别,但是不同存储引擎对于隔离级别的支持程度不一样(InnoDB是支持4个隔离级别的)
-
死锁
(1) 为了解决死锁,数据库系统实现了各种死锁检测和死锁超时机制
(2) InnoDB处理死锁的方式:回滚拥有最少排他行级锁的事务
-
事务日志
(1) 传统的处理方式是:每次数据改变,都更新对应的磁盘中的记录
(2) 引入日志以后的处理方式是:
1° 更新数据在内存中的拷贝
2° 写更新数据的日志(日志保存在磁盘上)
3° 更新磁盘中的记录
这样做的好处是__更快__,因为1°和2°都是快操作(写日志不需要磁盘的随机移动),而3°可以在时间空闲时完成
-
MySQL中不是所有的事务都是支持存储引擎的,常见的例如InnoDB就是支持事务的存储引擎,MyISAM就是不支持事务的存储引擎
-
MySQL中的事务
(1) MySQL提供了3个事务型存储引擎(也就是说其他存储引擎是不支持事务的)
InnoDB, NDB Cluster, Falcon
(2) MySQL默认__AUTOCOMMIT__
1° 定义:
如果没有显式START TRANSACTION,那么每个操作都会变成单独一个事务来执行
2° SET AUTOCOMMIT = 0可以把自动提交模式关掉,这样做的效果是用户将一直处于某个事务中,直到用户执行COMMIT或ROLLBACK才开启新事务
3° 对于事务型存储引擎,SET AUTOCOMMIT = xxx才有用;对于不支持事务的存储引擎,设不设置效果是一样的,一直工作在AUTOCOMMIT模式
(3) 一些命令可以使得事务提前提交,例如ALTER TABLE、LOCK TABLE等命令
(4) MySQL没有在服务器层(第一层)处理事务,而是在存储引擎层(第三层)处理事务,这导致了如果在事务中__混合__使用了事务型存储引擎的表和非事务型存储引擎的表,在需要回滚时非事务型存储引擎的表无法回滚,导致出现数据不一致的情况
所以,尽量不要混合处理
(5) MySQL中一个事务在执行过程中的任意时候都可以获得锁,但是只有COMMIT和ROLLBACK的时候才能释放锁(并且同时释放所有锁),这种属于__隐式锁定__
LOCK TABLES/UNLOCK TABLES可以进行__显式锁定__,但是最好不要用