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

日积月累
原文地址:https://www.cnblogs.com/qiumh/p/13089605.html