目录
1;事务的理解
对于事务的理解呢,该怎么说呢。嗯...举个例子吧,银行转账的话,a账户转给b账户100块,那么a账户减少100元,b账户增加100元,这个操作要么同时失败要么同时成功,这就是一个简单的事务。
对于事务我们用到的都是DML语句(具体点就是update,insert,delete)。
事务开启了:
insert...
insert...
update...
delete...
insert...
update...
...
事务结束!
在事务的执行过程中,每一条DML的语句操作都会记录在“事务性活动的日志文件中”
在事务的执行过程中,我们可以提交事务,也可以回滚事务(粗略地可以理解成撤销)
提交事务标志事务的结束,并且事务成功的结束
回滚事务将之前所有的DML操作全部撤销,并且情况事务性活动的日志文件,
回滚标志着事务的结束,但却是失败的结束。
2:提交事务和回滚事务
提交事务语句: commit;
回滚事务语句: rollback;
大家看到上面的图片应该会产生疑问,为什么回滚没有用呢?
这就说到了MySQL中的默认事务行为了
在正常情况下,MySQL默认是支持自动提交的(每写一条DML语句,直接提交)
如何将MySQL中的自动提交事务给关闭呢?
需要这个命令:start transaction;
关闭自动提交事务之后就可以愉快滴回滚啦!!!
上面这张图表示commit提交后,rollback只能回滚到这了。
3:事务隔离级别
事务隔离级别有四种(在这里我列举两个事务,就叫他们a和b了)
(1)读未提交 read uncommitted(最低的隔离级别)
比如说a可以读到b中还未提交的数据(所以一般数据库不用这种隔离级别,一般都是从二号开始的)
(2)读已提交 read committed
a只能读到b提交的数据
(3)可重复读 repeatable read
就是第一次读的数据,你后面读的话,还是还会读它,这就叫可重复读
(4)序列化 serializable (最高的隔离级别)
嗯...就是事务之间是有顺序的,一个事务没有提交结束之前,另外一个事务无法进行操作
查看隔离级别的命令
select @@transaction_isolation;(我的是MySQL80,用这个命令,别的版本可能就不是了)
下面开始验证,所以开两个窗口表示两个事务
注意在验证的时候一定要记得修改隔离级别啊!!!
还有要记得关闭自动提交事务(start transaction),然后再退出MySQL,重新进入
修改隔离级别命令:set global transaction isolation level 隔离级别(如read uncommitted)
(1)读未提交
假设stu中是空表
a: b:
select *from stu;
insert into stu values('jk',18);
//b表中还未提交,但是却可以查到
select *from stu;
(2)读已提交
修改隔离级别别忘了
a: b:
start trancsaction;
select *from stu;//空表
insert into stu values('iui',10);
select *from stu;//空表
commit;
select *from stu;//b事务提交之后,查到了表
(3)可重复读
a: b:
start transaction; start transaction;
select *from stu;//表中之前的内容
insert into stu values('89',9);
select *from stu;//表中不变
commit;
select *from stu;//表中的内容还是不变,那么这个隔离级别就可以暂且理解成给我们造成一种幻想,实际
早已发生了改变了
(4)序列化
a: b:
start transaction; stat transaction;
select *from stu;//正常查询
delete from stu;//删除数据
select *from stu;//查出来是空表
select *from stu;//光标不懂,无法进行操作
commit;
//不需要输入任何东西,a事务中commit提交事务之后
b事务这里直接出现上一条命令的结果,即查询是空表
序列化,那么理解的话不就是排队吗(哈哈哈)
本文到此结束,如有错误,还请指正哈!!!