事务是一个最小的不可分割的工作单元,事务能够保证一个业务的完整性

事务要解决的问题:两条语句只能同时成功同时失败

mysql中如何控制事务——commit、rollback

1.mysql默认是开启事务的

select @@autocommit;

作用:执行任何一个mysql语句,效果会立即显现出来,不能回滚

查询所有mysql 事务_mysql

create table user(
id int primary key,
name varchar(20),
money int
);
insert into user values(1,‘a’,1000);

——事务回滚:撤销mysql语句执行效果

autocommit=1时自动提交,不能撤销

查询所有mysql 事务_事务隔离_02


——实现撤销:设置mysql自动提交为false

set autocommit=0;

与上面对比:

查询所有mysql 事务_隔离级别_03


手动提交:commit;——提交后不可以再rollback

autocommit=0,1的区别:
autocommit=0: 不自动提交,mysql语句提交后可以再撤销
autocommit=1: 自动提交,mysql语句提交后不能再撤销

手动开启事务begin_start_transaction

begin; 或 start transaction;都可以帮我们手动开启一个事务

查询所有mysql 事务_查询所有mysql 事务_04

ACID的特征与使用

A:原子性 事务是最小的单位,不可以再分割
C:一致性 事务要求事务中的所有sql语句必须保证同时成功或同时失败
I:隔离性 事务1和事务2 之间具有合理性
D:持久性 事务一旦结束(commit,rollback),就不可以返回

事务开启:
1.修改默认提交 set autocommit=0;
2.begin;
3.start transaction;
事务手动提交(让虚拟效果真实产生)
commit;
事务手动回滚:(让虚拟的效果被撤销)
rollback;

事务隔离性

1.read uncommitted; 读未提交的
2.read committed; 读已提交的
3.repeatable; 可以重复读
4.serializable; 串行化

事务隔离性——脏读(一个事务可以读到另一个事务未提交的)

read uncommitted;
如果有事务a事务b,a事务对数据进行操作但是未提交,但是b可以看见a操作的结果
1.read committed
如何查看数据库的隔离级别?
select @@global.transaction_isolation(mysql8.0)
修改数据库的隔离级别
set global transaction isolation level read uncommitted;
转账——小明在淘宝买鞋800元
小明->成都 ATM
淘宝->广州 ATM

start transaction; (开启事务)
update user set money=money-800 where name=‘小明’;
update user set money=money+800 where name=‘淘宝’;

脏读:一个事务读到了另一个事务没有提交的数据
实际开发不允许脏读出现

事务隔离性——不可重复读(一个事务可以读到另一个事务已经提交的)

set global transaction isolation level read committed;

事务隔离性——幻读

set global transaction isolation level repeatable read;
事务a和事务b同时操作一张表,事务a提交的数据也不能被事务b读到

事务隔离级别——串行化

set global transaction isolation level serializable;——修改隔离级别为串行化
start transaction;
当user表被另外一个事务操作时候,其他事务的写操作是不能进行的,进入排队状态(串行化),这个事务结束后,其他事务的写操作才能够进行

几种隔离级别的性能排名:
read-uncommitted>read-committed>repeatable-read>serializable
隔离级别越高性能越差
默认级别:repeatable-read