一、定义
Transaction Control Lanuage——事物控制语言;
事物:一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。
二、MySQL中的存储引擎
2.1 含义
存储引擎:在MySQL中的数据用各种不同的技术存储在文件(或内存)中。
2.2 如何查看储存引擎?
通过show engines;来查看MySQL支持的存储引擎。
2.3 存储引擎有哪些?
在MySQL中用最多的存储引擎有:innob,myisam,memory等。其中innob支持事务,而myisam、memory等不支持事物。
三、事务ACID属性(面试题★)
1. 原子性(Atomicity):
一个事务不可再分割,要么都执行要么都不执行。
2. 一致性(Consistency):
一个事务执行会使数据从一个一致状态切换到另一个一致状态.
3. 隔离性(Isolation):
一个事务的执行不受其他事务的干扰.
4. 持久性(Durability):
一个事务一旦提交,则会永久的改变数据库的数据.
四、事务的创建
4.1 隐式事务
事务没有明显的开启和结束的标记,比如insert、update、delete语句。
4.2 显示事务
事务具有明显的开启和结束的标记,前提:必须先设置自动提交功能为禁用。
步骤1:开启事务:
set autocommit=0;
start transaction;(可选的)
步骤2:编写事务中的sql语句(select insert update delete):
语句1;
语句2;
...
步骤3:结束事务:
commit;结束事务
rollback;回滚事务(savepoint 节点名;设置保存点,搭配rollback to 节点名使用,表示回滚到保存点)
五、事务并发问题
5.1 原因
对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题。
5.2 事务并发的类型
5.2.1 脏读
对于两个事务T1,T2,T1读取了已经被T2更新但还没有被提交的字段之后,若T2回滚,T1读取的内容就是临时且无效的。
5.2.2 不可重复读
对于两个事务T1,T2,T1读取了一个字段,然后T2更新了该字段之后,T1再读取同一字段,值就不同了。
5.2.3 幻读
对于两个事务T1,T2,T1从一个表中读取了一个字段,然后T2在该表中插入了一些新的行之后,如果T1再次读取同一个表,就会多出几行。
六、事务的隔离级别
6.1 含义
一个事务与其他事务隔离的程度称为隔离级别。
6.2 隔离级别
脏读 不可重复读 幻读
read uncommitted: √ √ √
read committed: × √ √
repeatable read: × × √
serializable: × × ×
MySQL中默认第三个隔离级别 repeatable read;
Oracle中默认第二个隔离级别 read committed。
6.3 如何设置隔离级别
1.查看当前隔离级别:select @@tx_isolation;
2.设置当前MySQL连接的隔离级别:set session transaction isolation level read committed;
3.设置数据库系统的全局的隔离级别:set global transaction isolation level read committed;