TCL
Transaction Control Language 事务控制语言
事务:
一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。
事务的特性:
ACID
原子性:一个事务不可再分割,要么都执行要么都不执行
一致性:一个事务执行会使数据从一个一致状态切换到另外一个一致状态
隔离性:一个事务的执行不受其他事务的干扰
持久性:一个事务一旦提交,则会永久的改变数据库的数据.
MySQL 中的存储引擎[了解]
1、概念:在mysql中的数据用各种不同的技术存储在文件(或内存)中。
2、通过show engines;来查看mysql支持的存储引擎。
3、 在mysql中用的最多的存储引擎有:innodb,myisam ,memory 等。其中innodb支持事务,而myisam、memory等不支持事务
事务的创建
隐式事务:事务没有明显的开启和结束的标记
比如insert、update、delete语句
显式事务:事务具有明显的开启和结束的标记
前提:必须先设置自动提交功能为禁用
set autocommit=0;
步骤1:开启事务
set autocommit=0;
start transaction;可选的
步骤2:编写事务中的sql语句(select insert update delete)
语句1;
语句2;
…
注意,sql语句支持的是insert,update,delete
步骤3:结束事务
commit;提交事务
或
rollback;回滚事务
提交:成功的结束,将所有的DML语句操作历史记录和底层硬盘数据来一次同步
回滚:失败的结束,将所有的DML语句操作历史记录全部清空
事务并发问题
1、事务的并发问题是如何发生的?
多个事务 同时 操作 同一个数据库的相同数据时
2、并发问题都有哪些?
- 脏读: 对于两个事务 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段.
之后, 若 T2 回滚, T1读取的内容就是临时且无效的.(一个事务读取了其他事务还没有提交的数据,读到的是其他事务“更新”的数据) - 不可重复读: 对于两个事务T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段
之后, T1再次读取同一个字段, 值就不同了.(一个事务多次读取,结果不一样) - 幻读: 对于两个事务T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插
入了一些新的行. 之后, 如果 T1 再次读取同一个表, 就会多出几行.(一个事务读取了其他事务还没有提交的数据,只是读到的是 其他事务“插入”的数据)
3、如何解决并发问题
通过设置隔离级别来解决并发问题
事务的隔离级别:
mysql中默认 第三个隔离级别 repeatable read
oracle中默认第二个隔离级别 read committed
查看隔离级别
select @@tx_isolation;
设置隔离级别
set session|global transaction isolation level 隔离级别;
回滚点的使用
SET autocommit=0;
START TRANSACTION;
DELETE FROM account WHERE id=25;
SAVEPOINT a;#设置保存点
DELETE FROM account WHERE id=28;
ROLLBACK TO a;#回滚到保存点
#会删除id = 25的行 不会删除id = 28的行
事务对于delete和truncate的处理的区别
使用delete删除表,可以支持回滚,该表不会被删除
SET autocommit = 0;
START TRANSACTION;
DELETE FROM account;
ROLLBACK;
使用truncate删除表不支持回滚,该表会被删除
SET autocommit = 0;
START TRANSACTION;
TRUNCATE account;
ROLLBACK;