前言:当mysql学习完了DML(数据操作语言)和DDL(数据定义语言)、DQL(数据查询语言),最后终于来到了SQL语言中TCL(事务控制语言)。
TCL(事务控制语言)
1.什么是事务?
事务: 一个或者一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。
事务 由单独单元的一个或多个SQLy语句组成,在这个单元中,每个MYsql语句是相互依赖的。而整个单元作为一个整体,如果其中执行某条sql语句失败或产生错误,则整个单元将会 回滚 (撤销执行过的状态,回到开始以前的状态)。
2.了解MySQL中的存储引擎:
1.概念: 在mysql中数据用各种不同技术存储在文件(或内存)中。
2.在mysql中常用的存储引擎: innodb,myisam,memory等。其中 innodb 支持事务,myisam和memory等不支持事务。
3.可以通过show engines; 来查看mysql支持的存储引擎.
myisam和innodb区别:
3.事务的特性(ACID):
原子性:一个事务不可再分割,要么都执行要么都不执行;
一致性:一个事务执行会将数据从一个一致状态切换到另一个一致状态;
隔离性:一个事务的执行不受其他事务的干扰;
持久性:一个事务一旦提交,则会永久的改变数据库的数据;
语法:
步骤1:开启事务
set autocommit=0;
start transaction;可选的
步骤2:编写事务中的sql语句(select insert update delete)
语句1...
语句2...
....
步骤三:结束事务;
commit;提交事务
rollback;回滚事务
mysql中不支持执行期间的回滚事务
演示:
set autocommit=0;
start transaction;
delete from 表;
commit;
补充:savepoint 节点名:设置节点或保存点
演示:
set autocommit=0;
start transaction;
delet from 表 where 筛选条件
savepoint a;#设置保存点
delet from 表 where 筛选条件
rollback a;#回滚到保存点a;
4.事务隔离
一、事务的并发问题:
缘由:对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题。
1.脏读: 对于两个事务T1,T2,T1读取了T2已经被T2更新但还没有被提交的字段。之后,若T2回滚,T1读取的内容就是临时且无效的。
2.不可重复度: 对于两个事务T1,T2,T1读取了一个字段,然后T2更新了该字段。之后,T1再次读取同一个字段,值就不同了。
3.幻读: 对于两个事务T1,T2,T1从一个表中读取了一个字段,然后T2在该表中插入了一些新的行。之后,如果T1再次读取同一个表,就会多出现几行。
二、数据库提供的四种事务隔离:
read uncommitted (读未提交的数据) :允许事务读取未被其他事务提交的变更。脏读,不可重复读,幻读都会出现
read commited (读已提交的数据) :只允许事务读取已经被其它事务提交的变更。可以避免脏读。
repeatable read(可重复读) :确保事务可以多次从一个字段中读取相同的值.在这个事务持续期间,禁止其它事务对这个字段进行更新。可以避免脏读和不可重复读.
serializable(串行化) :确保事务可以从一个表中读取相同的行。在这个事务持续期间,禁止其它事务对该表进行插入,更新和删除操作,可以避免所有并发,但性能十分低下。
oracle支持:read commited,serializable。默认:read commited
mysql支持四种.默认:repeatable read
数据库的隔离性: 数据库系统必须具有隔离并发运行各个的能力,是使它们互不影响;避免各个问题出现。
数据库的隔离级别: 一个事务与其他事务隔离的程度称为隔离级别。数据库规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据库一致性就越好,但鬓发性越弱。
相关操作:
查看当前隔离级别:select @@tx_isolation
设置当前mysql连接的隔离级别:set session transaction isolation level 事务隔离;
设置数据库系统的全局隔离级别:set global transaction isolation level 事务隔离;