TCL(事务控制)语言的学习
目录
- 事务的创建步骤
- 演示savepoint的影响
- 演示事务的使用步骤
- 事务的隔离级别
事务概念: 一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。
事务的属性(ACID):
原子性: 一个事务不可再分割,要么都执行,要么都不执行
一致性:一个事务执行会使数据从一个一致状态切换到另外一个一致状态
隔离性: 一个事务的执行不受其他事务的干扰
持久性: 一个事物一旦提交,则会永久的改变数据库的数据
事务的创建
1、隐式事务:事务没有明显的开启和结束的标记
比如:insert update delete语句
2、显示事务:事务具有明显的开启和结束的标记
前提: 必须先设置自动提交功能为禁用
语法:
set autocommit=0; #(只针对当前事务,下次需要重新关闭事务)
show variables like 'autocommit';#查看事务是否开启(on为开启,off为关闭)
show engines;#查看存储引擎
事务的创建步骤:
步骤一:开启事务
set autocommit=0;#禁用自动提交
start transaction;#可选的
步骤二:编写事务中的sql语句(select insert update delete)
语句1;
语句2;
语句3;
…
步骤三:结束事务
commit;#提交事务
rollback;#回滚事务
savepoint 节点名;#设置保存点
#演示savepoint的影响
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的数据没有被删除
注意: savepoint只能搭配rollback使用
#演示事务的使用步骤
#创建account表
drop table if exists account;
create table account(
id int primary key auto_increment,
username varchar(20),
balance double
);
insert into account(username,balance) values('张无忌',1000),('赵敏',1000);
#1、开启事务
set autocommit=0;
start transaction;
#2、编写一组事务的语句
update account set balance=500 where username='张无忌';
update account set balance=500 where username='赵敏';
#3、结束事务
commit;
并发问题有哪些?
1、脏读: 一个事务读取了其他事务还没有提交的数据,读到的是其他事务“更新”的数据
2、不可重复读: 一个事务多次读取,结果不一样
3、幻读: 一个事务读取了其他事务还没有提交的数据,只是读到的是其他事务“插入”的数据
如何解决并发问题?
通过设置隔离级别来解决并发问题
**
#事务的隔离级别**
read uncommitted(读未提交): 出现脏读、幻读、不可重复读
read committed(读已提交): 不出现脏读、但出现幻读和不可重复读
repeatable read(可重复读): 不出现脏读和不可重复读,但出现幻读
serializable(串行化): 不出现脏读、幻读、不可重复读(但效率较低)
mysql中默认第三个隔离级别: repeatable read
oracle中默认第二个隔离级别: read committed
查看当前默认隔离级别
select @@tx_isolation;
设置隔离级别
set seesion|global transaction isolation level 加隔离级别;
delete和truncate在事务使用时的区别
#演示delete(事务删除,支持回滚)
set autocommit=0;
start transaction
delete from account;
rollback;
#演示truncate(事务删除,不支持回滚)
set autocommit=0;
start transaction;
truncate table account;
rollback;