事务是一个最小的不可分割的工作单元,事务能够保证一个业务的完整性
事务要解决的问题:两条语句只能同时成功或同时失败
mysql中如何控制事务——commit、rollback
1.mysql默认是开启事务的
select @@autocommit;
作用:执行任何一个mysql语句,效果会立即显现出来,不能回滚
create table user(
id int primary key,
name varchar(20),
money int
);
insert into user values(1,‘a’,1000);
——事务回滚:撤销mysql语句执行效果
autocommit=1时自动提交,不能撤销
——实现撤销:设置mysql自动提交为false
set autocommit=0;
与上面对比:
手动提交:commit;——提交后不可以再rollback
autocommit=0,1的区别:
autocommit=0: 不自动提交,mysql语句提交后可以再撤销
autocommit=1: 自动提交,mysql语句提交后不能再撤销
手动开启事务begin_start_transaction
begin; 或 start transaction;都可以帮我们手动开启一个事务
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