mysql基础知识(2)
1、mysql事务
mysql中,事务其实是一个最小的不可分割的工作单元,事务能够保证一个业务的完整性
在开发中,可能会遇到有多条sql语句要求同时成功或者失败的情况
比如银行转帐:a转账给b,就会执行两条sql语句,这两条sql语句是一个整体,要么都执行成功,要么都执行失败,如果出现两条语句执行结果不一致的情况,就会造成数据的错误的现象
a——> -100
update user set money = money-100 where name='a';
b——> +100
update user set money = money +100 where name='b';
2、mysql中如何控制事务?
(1)mysql中默认是开启事务的(自动提交的状态就是表示自动开启的:@@autocommit)
select @@autocommit;
(2)默认事务开启的作用是什么?
当我们去执行一个sql语句的时候,效果会立即的体现出来,且不能回滚
事务回滚rollback:撤销SQL语句的执行效果
若关闭事务的自动提交功能,即可实现回滚:set autocommit=0;
手动开启事务也可以实现回滚的操作:begin或者start transaction;表示手动开启事务
事务开启后(包括自动开启和手动开启),一旦commit提交就不能在回滚
(3)事务的ACID特征与使用
事务的四大特征:
A 原子性:事务是最小的单位,不可再分割
C 一致性:事务要求,同一事务中的sql语句,必须保证同时成功或者同时失败
I 隔离性:事务1和事务2之间是具有隔离性的
D 持久性:事务一旦结束(commit,rollback),就不可以返回
手动开启事务两步 :
(1)修改默认提交set antocommit = 0;(2)begin或者start transaction;
手动提交事务:
commit;
手动回滚事务:
rollback;
(4)事务隔离性分析:
如何查看事务的隔离级别:
mysql 8.0版本:
系统级别:select @@global.transaction_isolation;
会话级别:select @@transaction_isolation;
mysql 5.0版本;
系统级别:select @@global.tx_isolation;
会话级别:select @@tx_isolation;
如何修改隔离级别:
set global transaction isolation level 隔离级别(如read uncommitted);
四种隔离级别:
(a)read uncommitted ——读未提交;如果有事务a和事务b,若在操作的过程中事务没有被提交,但是事务b能看见事务a操作的结果
(这种隔离机制是有问题的,如果两个不同的地方都在进行操作,如果事务a开启(没有提交)后他的数据可以被其他事务读取到,这样就会出现脏读(脏读:一个事务读取到另一个事务没有提交的数据))
(b)read committed ——读已经提交;出现不可重复读的问题
(c)repeatable read ——可以重复读;出现幻读的问题,事务a与事务b同时操作一张表,事务a提交了数据,但是a提交的数据不能被事务b读到
(d)serializable ——串行化;当数据表被一个事务操作的时候,其他事务里面的写操作是不可以进行的,其他事务进入等待状态(串行化),直到正在操作的事务结束后且在没有等待超市的情况下,在排队的事务才可以进行写操作。这种情况就造成了串行化的隔离级别性能差
四种隔离级别性能比较:read uncommitted>read committed >repeatable read >serializable
*mysql默认的隔离级别是:repeatable read