第五篇:事务控制语言TCL
transaction control language,事务控制语言。
Part 1: TCL的基本知识
一个或者一组sql语言组成一个事务,这个事务具有如下特点:
- 原子性:事务是不可分割的;
- 一致性:使得数据从一个状态变换到另一个状态;
- 隔离性:一个事务执行的过程中,不能被其他事务干扰;
- 持久性:事务执行的结果,是存储下来的。
事务的创建可以分为两种:
- 隐式的创建:一般以一行语法为主,没有明显的开始或者结束信号;
- 显式的创建:事务有明显的开启与结束的标志,但前提是要关闭自动提交功能。
备注:关闭自动提交功能的关键字是: set autocommit = 0;
显式的创建的语法:
start transaction; # 首先写开启事务的标志
sql language; # 然后写sql语言,组成一个事务
commit; # 通知系统,提交事务
备注:如果有需要,可以写回滚事务。
Part 2:MYSQL的隔离级别
MySQL支持的隔离级别:
- read uncommitted(读取未提交内容); 所有事务都可以看到其他未提交事务的执行结果。读取未提交的数据,也被称之为脏读(Dirty Read)。
- Read Committed(读取提交内容); 一个事务只能看见已经提交事务所做的改变,支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。
- Repeatable Read(可重读); 这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。这会导致幻读, 指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。
- Serializable(可串行化); 这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。但是牺牲了性能。
如何设置数据库的隔离级别?
语法:set session transcation isolation level 前述隔离级别;
Part 3:回滚
回滚是指在误操作之后,将数据恢复到原来某个状态的方法。
首先要设置一个回滚点,记录当下的状态。
语法:savepoint 保存点名;
之后即可对现有的操作进行回滚。
例1:展示回滚点的使用:
set autocommit = 0;
start transcation;
delete from book where price = 20;
savepoint point1;
delete from book where price = 30;
rollback to point1;
备注:回滚点的使用方法类似于回滚点之后的操作在回滚之后被撤销了。
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!