MySql事务控制语言

TCL:事务控制语言
事务:一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行
事务的特性:
原子性:一个事务不可再分割,要么都执行,要么都不执行
一致性:一个事务执行会使数据从一个一致状态切换到另外一个一致状态
隔离性:一个事务的执行不受其他事务的干扰
持久性:一个事务一旦提交,则会永久的改变数据库的数据

一、事务的创建

隐式事务:事务没有明显的开启和结束标记 ,比如 insert、update、delete语句
显示事务:事务具有明显的开启和结束标记,前提必须先设置自动提交功能为禁用

set autocommit = 0;
  1. 事务的创建步骤
//一、开启事务
set autocommit = 0;
start transaction;	可选的
//二、编写事务中的sql语句(select insert update delete)
语句1;
语句2;
....
//三、结束事务
commit;提交事务
rollback;回滚事务
  1. 演示事务的使用步骤
//开启事务
set autocommit=0;
start transaction;
//编写一组事务的语句
update account set balance = 500 where username = "张无忌";
update account set balance = 1500 where username = "赵敏";
//结束事务
commit;
  1. 事务的隔离等级
read uncommitted : 出现脏读、幻读、不可重复读
read committed : 避免出现脏读,出现幻读和不可重复读
repeatable read : 避免出现脏读和不可重读读,出现幻读
serializable : 避免出现脏读,不可重复读和幻读

mysql中默认 第三个隔离级别 repeatable read ,而oracle中默认第二个

查看隔离级别:
select @@tx_isolation;
设置隔离级别
set session | global transaction isolation level 隔离级别;
  1. 演示savepoint 的使用
set autocommit = 0;
start transaction;
delete from account where id = 25;
savepoint a;	设置保存点
delete from account where id = 28;
rollback to a;	回滚到保存点

二、并发事务

  1. 事务的并发问题是如何发生的?
多个事务 同时 操作 同一个数据库的相同数据时
  1. 并发问题有哪些?
    脏读:一个事务读取了其他事务还没提交的数据,读到的是其他事务 “更新” 的数据
    不可重复读:一个事务多次读取,结果不一样
    幻读:一个事务读取了其他事务还没有提交的数据,只是读到的是 其他事务 “插入” 的数据
  2. 如何解决并发问题?
通过设置隔离级别来解决并发问题
  1. 隔离级别
read uncommitted: 读未提交
read committed : 读已提交
repeatable read : 可重复读
serializable : 串行化

猜你喜欢

转载自blog.csdn.net/weixin_38739598/article/details/107393863