TCL(Transaction Control Language)事物控制语言

🍋事务

  • 事务:一个或者一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行(例如转账时)。如果某条sql语句一旦执行失败或者产生错误,整个单元将会回滚,所有收到影响数据将返回到事务开始之前的状态
  • 事务的ACID属性
    ❤️原子性(Atomicity):事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生
    ❤️一致性(Consistency):事务务必使数据库从一个一致性状态变换到另外一个一致性状态
    ❤️隔离性(Isolation):一个事物的执行不能被其他事物干扰,即一个事物内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能相互干扰
    ❤️持久性(Durability):一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何的影响

🍉事物的创建

  • 隐式事务:事务没有明显的开始和结束的标记,比如insert、update、delete语句
  • 显式事务:事务具有明显的开启和结束的标记,但前提是,必须先设置自动提交功能为禁用(set autocommit=0;仅针对当前事务有效,下次再用到的时候要重新关闭)
#步骤一 开启事务
set autocommit = 0; #此时已经默认开启事务了
start transaction#可选

#步骤二 编写事务中的sql语句(insert update delete select)

#步骤三 结束事务
commit;# 提交事务 二选一
rollback;# 回滚事务 二选一

🍑数据库的隔离级别

  • 对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题
  • Mysql支持4种事务隔离级别,默认的事物隔离级别为:REPEATABLE READ
  • READ UNCOMMITTED:读未提交的数据,允许事务读取未被其他事务提交的变更,脏读、不可重复读和幻读的问题都会出现
  • READ COMMITTED:读已提交的数据,只允许事务读取已经被其他事务提交的变更,可以避免脏读,但是不可重复读和幻读问题仍然存在
  • REPEATABLE READ:可重复读,确保事务可以多次从一个字段中读取相同的值,在这个事务的持续期间,禁止其他事务对这个字段进行更新,可以避免脏读和不可重复读,但幻读的问题仍然存在
  • SERIALIZABLE:串行化,确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除操作。所有的并发问题都能避免,但是性能十分低下
  • 查看当前的隔离级别
select @@tx_isolation;

#8.0之后的使用
select @@transaction_isolation;
  • 设置会话层面的隔离级别
set session transaction isolation level read committed;

*设置数据库系统的全局的隔离级别

set global transaction isolation level  read uncommitted;
  • 对数据库进行更新的时候可能会导致幻读的出现

🥑 事务的回滚

  • 在事务中,执行delete from tab_stu;然后执行回滚操作,则不会发生数据的删除,而如果执行的是truncate table tab_stu;即使执行了回滚操作,表中的数据仍然会被清空。
  • savepoint搭配rollback使用,回滚到指定点
set autocommit = 0;
start transaction;
delete from tab_stu where id =29;
savepoint a;   #a是返回点的名称
delete from tab_stu where id =32;
rollback to a;
#最后的执行结构,id=29的行被删除,32的没有被删除
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容