事务的概念
①是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行
②是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元
③适用于多用户同时操作的数据库系统的场景,如银行、保险公司及证券交易系统等等
④通过事务的整体性以保证数据的一致性 15/36
事务就是由单独单元的一个或多个sql语句组成,在这个单元中,每个sql语句都是相互依赖的。而整个单独单元是作为一个不可分割的整体存在,类似于物理当中的原子(一种不可分割的最小单位)。
往通俗的讲就是,事务就是一个整体,里面的内容要么都执行成功,要么都不成功。不可能存在部分执行成功而部分执行不成功的情况。
就是说如果单元中某条sql语句一旦执行失败或者产生错误,那么整个单元将会回滚(返回最初状态)。所有受到影响的数据将返回到事务开始之前的状态,但是如果单元中的所有sql语句都执行成功的话,那么该事务也就被顺利执行。
指事务是一个不可分割的最小工作单位,事务中的操作只有都发生和都不发生两种情况,如果事务中任何元素失败,整个事务将失败
事务必须使数据库从一个一致状态变换到另外一个一致状态
当事务完成时,数据必须处于一致状态
在事务开始前,数据库中存储的数据处于一致状态
在正在进行事务中 数据可能处于不一致状态
当事务完成时 数据再次回到已知的一致状态
举一个栗子,李二给王五转账50元,其事务就是让李二账户上减去50元,王五账户上加上50元;一致性是指其他事务看到的情况是要么李二还没有给王五转账的状态,要么王五已经成功接收到李二的50元转账。而对于李二少了50元,王五还没加上50元这个中间状态是不可见的。
一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
一个事务一旦提交成功,它对数据库中数据的改变将是永久性的,接下来的其他操作或故障不应对其有任何影响。
BEGIN或STARTTRANSACTION:显式地开启一个事务。
COMMIT或COMMIT WORK:提交事务,并使已对数据库进行的所有修改变为永久性的。
ROLLBACK 或ROLLBACK WORK:回滚会结束用户的事务,并撤销正在进行的所有未提交的修改。
SAVEPOINT S1:使用SAVEPOINT允许在事务中创建一个回滚点,一个事务中可以有多个 SAVEPOINT;“S1”代表回滚点名称。
ROLLBACK TO [SAVEPOINT] S1:把事务回滚到标记点
一个事务执行不能被其他事务干扰
①、脏读(读取未提交数据):脏读指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了并一定最终存在的数据,这就是脏读
案列1
比如事务B执行过程中修改了数据X,在未提交前,事务A读取了x,而事务B却回滚了,这样事务A就形成了脏读。 也就是说,当前事务读到的数据是别的事务想要修改成为的但是没有修改成功的数据。
②、不可重复读(前后多次读取,数据内容不一致):一个事务内两个相同的查询却返回了不同数据。这是山于查询时系统中其他事务修改的提交而引起的。
案列
事务A第一次查询得到一行记录rowl,事务B提交修改后,事务A第二次查询得到row1,但列内容发生了变化。
select*from member;1 zhangsan 20分
select * from Member;1 zhanasan 30分
①、幻读(前后多次读取,数据总量不一致):一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,另一个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,操作前一个事务的用户会发现表中还有没有修改的数据行,就好象发生了幻觉一样。
案列
假设事务A对某些行的内容作了更改,但是还未提交,此时事务B插入了与事务A更改前的记录相同的记录行,并且在事务A提交之前先提交了,而这时,在事务A中查询,会发现好像刚刚的更改对于某些数据未起作用,但其实是事务B刚插入进来的,让用户感觉很魔幻,感觉出现了幻觉,这就叫幻读 select * from member;查询到了6条记录
alter table member change
select * from member;
查询到了10条记录(更新了6条数据,还有4条数据,我没有更新到)
④、丢失更新:两个事务同时读取同一条记录,A先修改记录,B也修改记录(B不知道A修改过),B提交数据后B的修改结果覆盖了A的修改结果。案列
A30->40事务先完成 B30->50事务后完成
B的事务结果会覆盖A的事务结果,最终值为50
(1)read uncommitted(未提交读) :读取尚未提交的数据:不解决脏读
允许脏读,其他事务只要修改了数据,即使未提交,本事务也能看到修改后的数据值。也就是可能读取到其他会话中未提交事务修改的数居。
(2)read committed(提交读):读取已经提交的数据 :可以解决脏读
只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别(不重复读)。
(3)repeatable read(可重复度):重读读取:可以解决脏读和不可重复读-mvsa1默认的
可重复读。无论其他事务是否修改并提交了数据,在这个事务中看到的数据值始终不受其他事务影响
(4)serializable:串行化:可以解决脏读不可重复读和虚读-相当于锁表完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞。
mysql默认的事务处理级别是 repeatable read,而oracle和soL Server是 read committed
//事务隔离级别的作用范围分为两种:全局级:对所有的会话有效
会话级:只对当前的会话有效
1、查询全局事务隔离级别
show global ariableslike"isolation’; SELECT@@qlobaltxisolation;
2、查询会话事务隔离级别
show session variables like’8isolation’; SELECT@@sessiontxisolation; SELECT @@txisolation;
3、设置全局事务隔离级别
iset global transaction isolation level read committed;
4、设置会话事务隔离级别
set session transaction isolation level read committed;
BEGIN或START TRANSACTION:显式地开启一个事务。
COMMIT或COMMIT WORK:提交事务,并使已对数据库进行的所有修改变为永久性的。
ROLLBACK 或ROLLBACK WORK:回滚会结束用户的事务,并撤销正在进行的所有未提交的修改。
SAVEPOINT S1:使用SAVEPOINT允许在事务中创建一个回滚点,一个事务中可以有多个 SAVEPOINT:"S1"代表回滚点名称。
ROLLBACK TO [SAVEPOINT] S1:把事务回滚到标记点。
create database SCHOOL; I use SCHOOL;
create tableinfo(
id int(10) primary key not null, name varchar(40), money double);
insert into info values(1A’1000); insert into info values(2B’1000); select* from info;

测试回滚事务:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T2zwvVhf-1660111859722)(https://s2.loli.net/2022/08/09/U8aDx4Mjzh5CnG3.png)]
多点回滚:
S1
回滚S1

使用set 设置控制事务
SET AUTOCOMMIT=0 禁止自动提交
SET AUTOCOMMIT=0 开启自动提交MYSQL默认为1
SHOW VARIABLES LIKE ‘AUTOCOMMIT’ 查看MySQL中的AUTOCOMMIT值
如果没有开启自动提交当前连接的mysql的所有操作都会当成一个事务直到你输入rollback|commit当前事务才算结束,当前事务结束前新的mysql 连接无法读取到任何当前会话操作结果
如果开启了自动提交mysql会把每个sql语句当成一个事务,然后自动commit 当然无论开启与否 begin;commit|rollback都是独立的事务
你输入rollback|commit当前事务才算结束,当前事务结束前新的mysql 连接无法读取到任何当前会话操作结果
如果开启了自动提交mysql会把每个sql语句当成一个事务,然后自动commit 当然无论开启与否 begin;commit|rollback都是独立的事务