目录
1:事务简介
2:事务操作
3:事务四大特性
4:并发事务问题
5:事务隔离级别
1:事务简介
事务 是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
默认MysQL的事务是自动提交的,也就是说,当执行一条DML语句,MysQL会立即隐式的提交事务
2:事务操作
第一种方式
查看/设置事务的提交方式
select @@autocommit; -- @@autocommit不能有空格否则报错
set @@ autocommit=0; -- 把事务设置为手动的
1:自动 0:手动
提交事务
commit;
回滚事务
rollback
-- 准备的数据
drop table account;
delete from account;
update account set monkey=3000 where name='王大志';
update account set monkey=2000 where name='自习';
create table account (
id int primary key auto_increment,
name varchar(20) not null ,
age varchar(20) not null ,
monkey varchar(20) not null
) comment '人员的信息';
insert into account (age,name,monkey) values (18,'王大志',3000),(20,'自习',2000);
select @@autocommit;
set @@autocommit=0;
-- 1。 查询王大志三账户余额
select monkey from account where name='王大志';
-- 2。将王大志账户余额-1000
update account set monkey=monkey-1000 where name='王大志';
这里发出错误了
-- 3。将自习账户余额+1000
update account set monkey=monkey-1000 where name='自习';
-- 提交事务
commit
-- 回滚
rollback
sql默认的事务是自动的 但是如果在出现错误时:王大志给自习转账1000元,但是在给自习加上1000元钱之前sql发生错误, 就会导在我王大志-1000 但是自习没有加上1000; 我们这个时候就会把sql的事务该为手动的,在发生错误时我们选择回滚,数据并不会提交到数据库里面而是保证执行sql前的数据; 如果没有sql错误我们选择提交事务把这个命令提交到数据库层面
第二种方式
开启事务--默认改为手动
start transaction 或者 begin;
提交事务
commit
回滚事务
rollback;
3:事务四大特性
原子性 (Atomicity): 事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
一致性(Consisteny): 事务完成时,必须使所有的数据都保持一致状态
隔离性(lsolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的
4:并发事务问题
问题 | 描述 |
脏读 | 一个事务读到另外一个事务还没有提交的数据。 |
不可重复读 | 一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。 |
幻读 | 一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了幻影”。 (查无插有) |
5:事务隔离级别
隔离级别 | 赃读 | 不可重复读 | 幻读 |
Read uncommitted | √ | √ | √ |
Read committed | × | √ | √ |
Repeatable Read(默认) | × | × | √ |
Serializable | × | × | × |
查看事务的隔离级别
select @@transaction_isolation;
设置事务隔离级别
set [session | global] transaction isolation level {read uncommitted | read committed | repeatable read | serializable}
-- 查看事务隔离级别
select @@transaction_isolation;
-- 设置事务隔离级别
set session transaction isolation level read uncommitted ;
set session transaction isolation level repeatable read ;
-- session设置这次的绘画,更改隔离级别
脏读:
改变事务级别为,解决脏读问题:
不可以重复读:
改变事务级别为,解决不可重复读问题:
幻读:
改变事务级别为,解决幻读问题: