事务
事务的组成可由一条非常简单的SQL语句组成,也可由一组复杂的SQL语句组成。
特征
事务具有以下特征:
(1)在数据提交时,可以确保要么所有修改都已保存,要么所有修改不保存;
(2)事务是访问并更新数据库各种数据项的一个执行单元;
(3)在innodb下,每一条语句都是事务,可以通过set autocommit = 0 (默认值1,不需要手动添加开始事务和提交语句),设置当前会话手动提交,一般需要执行多条语句的时候,就会显式地开始事务。
指令
-- 显示开启事务
BEGIN
-- 提交事务,并使得已对数据库做的所有修改持久化
COMMIT
-- 回滚事务,结束用户的事务,并撤销正在进行的所有未提交的修改
ROLLBACK
-- 创建一个保存点,一个事务可以有多个保存点
SAVEPOINT identifier
-- 删除一个保存点
RELEASE SAVEPOINT identifier
-- 事务回滚到保存点
ROLLBACK TO [SAVEPOINT] identifier
事务的ACID特性
(1)原子性
a. 事务要么都做(提交),要么都不做(回滚);
b.事务是访问并更新数据库各种数据的执行单元,执行单元是不可分割的单位;
c.通过undolog来实现回滚(语句的操作都会记录在undolog中),当回滚时,回放事务具体操作的逆运算
(2)隔离性
a.mysql在处理每一个连接的请求是并发的,所以需要隔离性;
b.事务的隔离性要求每个读写事务对象对其他事务的操作对象能互相分离,也就是事务提交前对其他事务不可见
c.通过MVCC和锁来实现,MVCC是多版本并发控制,主要解决一致性非锁定读,通过记录和获取行版本,而不是通过锁来限制读操作,从而实现高并发读性能;
d.通过锁来处理数据库的DML操作,数据库提供了针对表(聚集索引B+树)、页(聚集索引B+树的叶子节点)、行(叶子节点当中某一段记录行)等三种粒度加锁