1. MySQL 事务是什么:
一系列SQL语句需要捆绑执行,要么全部执行,要么全部不执行,这一系列捆绑在一起的操作(SQL语句)就是一个事务。
事务是MySQL执行的最小单元,它是原子性的操作。
例如,A转账给B 100元,这时就要对数据库进行两个操作:
(1)A账户的余额 -100:
mysql> update money_db set A -100; //伪代码
(2)B账户的余额 +100:
mysql> update money_db set B +100;
显然这两行SQL语句必须全执行或者全不执行。
这时就需要以事务的形式进行MySQL数据库操作。
MySQL事务的四个特性:(ACID)
(1) 原子性: (Atomicity)
一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
(2) 一致性: (Consistency)
在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
(3) 隔离性: (Isolation)
数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
事务隔离分为不同级别,包括 读未提交(Read Uncommitted)
、读提交(Read Committed, RC)
、可重复读(Repeatable Read, RR)
和 串行化(Serializable)
。
(4) 持久性: (Durability)
事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
简言之,就是保证事务的中间状态不被其他并行执行的事务看到,且多个事务并行执行后的效果与各个事务串行执行的结果完全相同。
2. 如何实现MySQL事务:
事务控制语句:
// 标识事务的开始:
BEGIN; 或者 START TRANSACTION; //二者等价
// 提交:
COMMIT;
// 回退:
ROLLBACK;
// 设置回退点:
SAVEPOINT <point_name>;
ROLLBACK TO <point_name>;
RELEASE SAVEPOINT <point_name>;
//举例:
//第一组:begin + commit, 成功提交
mysql> begin; //开始事务
mysql> insert into runoob_tb1
-> (runoob_title, runoob_author, submission_date)
-> values
-> ("学习", "计算机", NOW());
//select * from runoob_tb1;
//这时查看表是可以查到新插入的这项的,但是并不是真正的插入,可以回退掉,
//因为整个事务只能要么全完成,要么全不完成
mysql> insert into runoob_tb1
-> (runoob_title, runoob_author, submission_date)
-> values
-> ("学习", "数据库", NOW());
mysql> commit; //提交事务
//第二组:begin + rollback, 回退不提交
mysql> begin; //开始事务
mysql> insert into runoob_tb1
-> (runoob_title, runoob_author, submission_date)
-> values
-> ("学习", "数据库", NOW());
mysql> rollback; //回退,不提交
//第三组:begin + savepoint + rollback to + commit, 回退一部分后提交
mysql> start transaction;
mysql> insert into runoob_tb1
-> (runoob_title, runoob_author, submission_date)
-> values
-> ("事务", "操作_1", NOW());
mysql> savepoint point_1; //回退点的名字随便起,留给后面rollback to使用
//这里就是一个分界点,rollback to point_1; 后,
//保留点前面的操作保留,保留点后面的操作删除
mysql> insert into runoob_tb1
-> (runoob_title, runoob_author, submission_date)
-> values
-> ("事务", "操作_2", NOW());
mysql> rollback to point_1;
mysql> commit; //"操作_1"会提交成功
Tips:
- 创建保留点: 对于简单的事务处理可以使用 ROLLBACK 或 COMMIT 语句进行写入或撤销整个事务,但是对于复杂的事务处理,可能需要分部分的提交或者回退;且保留点应尽量的多,以便灵活的进行回退;
- 释放保留点: 保留点(SAVEPOINT)在事务处理完成之后会自动释放,在MySQL 5之后也可以明确的显式释放:RELEASE SAVEPOINT + <point_name>;
3. 如何查看当前有哪些运行的事务:
# 查看当前运行着的所有事务,及具体的语句:
select * from information_schema.INNODB_TRX;
# 查看当前出现的锁:
select * from information_schema.INNODB_LOCKS;
# 锁等待的对应关系:
select * from infomation_schema.INNODB_LOCKS_WAITS;
MySQL中有三个数据库是自带的,show database 就能看的到:
information_schema
mysql
performance_schema
其中,information_schema 和 performance_schema 一样,都是MySQL自带的“信息数据库”。
performance_schema 用于 性能分析;
information_schema 用于存储数据库元数据(关于数据的数据),例如数据库名、表名、列的数据类型、访问权限等。