Mysql系列_基础_06_Mysql事务控制语句(TCL)

事务定义

访问并更新数据库中各种数据项的一个程序执行单元,用来管理 insert,update,delete 语句。

事务四大特性

原子性:事务中包含的所有操作,要么全部成功执行,要么失败全部回滚。

一致性:事务执行前后,数据库必须处于一致性状态
PS:假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。

隔离性:隔离性是指在并发操作中,不同事务之间应该按照设定的隔离级别隔离开来,使每个并发中的事务不会相互干扰。

持久性:一旦事务提交成功,事务中所有的数据操作都必须被持久化到数据库中,即使提交事务后,数据库马上崩溃,在数据库重启时,也必须能保证通过某种机制恢复数据。

事务隔离级别

Read uncommitted (读未提交)
实质:

  • 如果A事务读取数据,那么其他事务可以任意操作操作该数据
  • 如果A事务已经开始写数据了,那么不允许其他事务进行写操作,但是可以读取A事务还未提交的数据

问题:如果B事务读取了A事务操作的数据后,A事务进行了回滚,那么B事务读取的数据就会变成脏数据,从而造成脏读

Read committed (读已提交)
实质:

  • 如果A事务读取数据,那么其他事务可以任意操作操作该数据,且已提交的事务的修改才可被读取
  • 如果A事务已经开始写数据了,那么不允许其他事务进行读写操作,只有A事务提交了事务,其他事务才可读写A事务操作的数据

问题:如果B事务先读取了数据,然后A事务写B读取的数据,然后提交事务后,B事务再次读取对应数据,那么就会出现两次读取的数据不一致的问题,从而造成不可重复读

Repeatable read (可重复读)
实质:

  • 如果A事务读取了数据,那么其他事务可以任意操作操作该数据,但是A食物每次读取的行的数据不变,也就是可重复读
  • 如果A事务已经开始了写数据,那么不允许其他事务进行读写操作,只有A事务提交了事务,其他事务才可读写A事务操作的数据

问题:如果A事务先读取了表一的数据,然后B事务在表一先添加了一条数据并且提交了数据,这时,A事务对表一的数据做了修改,同时修改了B事务添加的数据,那么A事务下次读取数据的时候,就会把B事务添加的那条数据读取出来,这便是幻读

Serializable(串行化)
实质:读数据和写数据都会加锁,因此每次读取的数据都会是一样的,解决了幻读的问题

隔离级别问题

脏读
脏读指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了并一定最终存在的数据,这就是脏读。
不可重复读
在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据是不一致的。通常针对数据更新(UPDATE)操作。
虚读(幻读)

  • 如果A事务先读取了表一的数据,然后B事务在表一先添加了一条数据并且提交了数据,这时,A事务对表一的数据做了修改,同时修改了B事务添加的数据,那么A事务下次读取数据的时候,就会把B事务添加的那条数据读取出来
  • 如果A事务先读取了表一的数据,然后B事务删除了A事务读取的记录并提交了事务,此时A事务对于B事务删除的记录的修改删除都不生效,但是查询出来的数据还是有B事务删除的记录

事务控制语句

显示的开启一个事务:START TRANSACTION | BEGIN
注意:在存储过程中,MYSQL数据库的分析器会自动将BEGIN识别为BEGIN…END,因此在存储过程中只能使用START TRANSACTION语句来开启一个事务。

提交事务:COMMIT

回滚事务:ROLLBACK

创建保存点:SAVEPOINT identifiter

删除保存点:RELEASE SAVEPOINT identifier

回滚到保存点:ROLLBACK to [SAVEPOINT] identifier

查询隔离级别:

  • 查看当前会话隔离级别:select @@tx_isolation;
  • 查看系统当前隔离级别:select @@global.tx_isolation;

设置隔离级别:
set [glogal|session] transaction isolation level 隔离级别名称;
set tx_isolation=’隔离级别名称’;

禁止自动提交:SET AUTOCOMMIT=0

开启自动提交:SET AUTOCOMMIT=1

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值