MySQL--事务

2023-10-28 10:49:48 浏览数 (1)

事务

15.1 基础知识

mysql默认自动事务提交,事务面对增,删,改操作时的一种控制手段,当面对一次操作多条记录,或都多个连接同时操作一条记录时的统一性管理手段,控制的是,增,删,改操作是否有效

查看刚当mysql的自动事务提交:

show session variables like '%autocommit%'

自动事务提交代表着,当执行insert update delete语句时会决定结果立即发生变化

1、关闭自动事务提交

set @@autocommit=0;

2、开启一个新的事务

start transaction;

3、执行增,删,改操作

insert into student values(null,'123123','梅澳','男',3,'13312344333','重庆市',now(),null,null,null); update student set address='重庆市石桥铺',email='33333@qq.com' where studentNo=37;

4、根据情况决定是提交还是回滚

commit; 提交

rollback; 回滚

select ROW_COUNT(); ROW_COUNT();执行增,删,改操作的SQL语句时如果执行成功返回大于0的结果,执行失败返回0

银行转账案例:

代码语言:javascript复制
set @@autocommit=0;
start transaction;
update mybank set bank=bank-500 where id=1;
select ROW_COUNT();
update mybank set bank=bank 500 where id=3;
select ROW_COUNT();
commit;

rollback;
##根据select ROW_COUNT();来判定是否要提交还是回滚

创建还原点:

savepoint 名称; 创建还原点

rollback to 还原点名称; 回滚到还原点上,原点以下的操作回滚,还原点以上的操作提交

案例:

代码语言:javascript复制
start transaction;
insert into mybank values(null,'张三',100);
savepoint a1;
insert into mybank values(null,'李四',200);
savepoint a2;
insert into mybank values(null,'王五',300);
savepoint a3;
insert into mybank values(null,'朱六',400);
rollback to a2;
commit;

15.2 事务的基本要素

原子性(Atomicity):

事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。

一致性(Consistency):

事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。

隔离性(Isolation):

同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。(相当于多线程中的上锁)

持久性(Durability):

事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

15.3 并发问题

脏读:

事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据

不可以重复读

事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。

幻读

事务A在一个事务中查询数据,第一次查询出现两条,同时事务B在添加数据并提交,事务A再次查询数据出现了3条,这时就叫幻读

15.4 隔离级别

REPEATABLE-READ 这是mysql默认的事务隔离级别

show session VARIABLES like '%tx_isolation%' 查看当前会话的事务隔离级别

set session TRANSACTION ISOLATION level read uncommitted; 修改当前会话的事务隔离级别为读未提交

案例:

事务 B对修改回滚以后,事务A又读取到以前的数据了,这就是脏读。 

不可重复读就是在这个过程中把rollback变成了commit。事务A可以读取到事务B提交后的数据,这是不可重复读。

幻读就是事务B在添加后进行了commit,事务A多次读取的记录的数量不一致,这就是幻读。

set session TRANSACTION ISOLATION level repeatable read; 修改事务为默认级别,幻读已经解决。

set session TRANSACTION ISOLATION level read committed; 修改当前会话的事务隔离级别为不可重复读

set session TRANSACTION ISOLATION level serializable; 修改事务为串行化,效率低下

0 人点赞