TCL
/*
Transaction Control Language 事务控制语言
事务:
一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行
案例:转账
张三丰 1000
郭襄 1000
update 表 set 张三丰的余额=500 where name = '张三丰'
意外
update 表 set 郭襄的余额=1500 where name = '郭襄'
事务的特性:
原子性:一个事务不可再分割,要么都执行要么都不执行
一致性:一个事务执行会使数据从一个一致状态切换到另外一个一致状态
隔离性:一个事务的执行不受其他事务的干扰
持久性:一个事务一旦提交,则会永久的改变数据库的数据
事务的创建:
隐式事务:事务没有明显的开启和结束的标记
比如insert、update、delete语句
delete from 表 where id = 1
显示事务:事务具有明显的开启和结束的标记
前提:必须先设置自动提交功能为禁用
set autocommit = 0;
步骤1:开启事务
set autocommit = 0;
start transaction;可选的
步骤2:编写事务中的SQL语句 (select insert update delete)
语句1;
语句2;
...
步骤3:结束事务
commit;提交事务
rollback;回滚事务
开启事务的语句;
update 表 set 张三丰的余额=500 where name = '张三丰'
update 表 set 郭襄的余额=1500 where name = '郭襄'
结束事务的语句;
*/
image.png
image.png
演示事务的使用步骤
开启事务
set autocommit = 0
start transaction;
编写一组事务的语句
update account set balance = 500 where username = '张无忌'
update account set balance = 1500 where username = '赵敏'
结束事务
commit
rollback
数据库的隔离级别
image.png查看当前默认的隔离级别
select @@ex_isolation
设置当前mysql连接的隔离级别
set transaction isolation level read committed
设置数据库系统的全局的隔离级别
set global transaction isolation level read committed
savepoint节点名:设置保存点
不同事务隔离级别的区别:
读未提交:一个事务还未提交,它所做的变更就可以被别的事务看到
读提交:一个事务提交之后,它所做的变更才可以被别的事务看到
可重复读:一个事务执行过程中看到的数据是一致的。未提交的更改对其他事务是不可见的
串行化:对应一个记录会加读写锁,出现冲突的时候,后访问的事务必须等前一个事务执行完成才能继续执行
我们来看看在不同的隔离级别下,事务 A 会有哪些不同的返回结果,也就是图里面 V1、V2、V3 的返回值分别是什么。
若隔离级别是“读未提交”, 则 V1 的值就是 2。这时候事务 B 虽然还没有提交,但是结果已经被 A 看到了。因此,V2、V3 也都是 2。
若隔离级别是“读提交”,则 V1 是 1,V2 的值是 2。事务 B 的更新在提交后才能被 A 看到。所以, V3 的值也是 2。
若隔离级别是“可重复读”,则 V1、V2 是 1,V3 是 2。之所以 V2 还是 1,遵循的就是这个要求:事务在执行期间看到的数据前后必须是一致的。
若隔离级别是“串行化”,则在事务 B 执行“将 1 改成 2”的时候,会被锁住。直到事务 A 提交后,事务 B 才可以继续执行。所以从 A 的角度看, V1、V2 值是 1,V3 的值是 2。
read uncommitted读未提交数据 允许事务读取未被其他事务提交的变更,脏读、不可重复读和幻读的问题都会出现。
脏读;对于两个事务t1,t2,t1读取了已经被t2更新但还没有被提交的字段,之后,若t2回滚,t1读取的内容就是临时且无效的
image.png
read-commitled读已提交数据 ,只允许事务读取已经被其它事务提交的变更,可以避免脏读,但不可重复读和幻读问题仍然可能出现
image.pngrepeatable read可重复读 确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其它事务对这个字段进行更新,可以解决脏读和不可重复读,不能解决幻读
image.pngimage.png
repeatable read可重复读
image.pngserializable串行化确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其它事务对该表执行插入,更新和删除操作,所有并发问题都可以避免,但性能十分低下
演示savepiont 的使用
delete from account where id = 25
savepoint a;设置保存点
delete from account where id = 28
rollback to a;回滚到保存点
image.png
网友评论