mysql数据库事务(事务设置、隔离级别、实现原理)

目录

事务

数据库事务

事务特性

事务设置

事务隔离级别

1.读未提交

2.读已提交

3.可重复读

4.串行化

事务实现原理

原子性:undolog

持久性:redolog

隔离性:

如果隔离级别是读已提交:

如果隔离级别是可重复读:


事务

数据库事务

一次对数据库操作过程,有多条sql,视为一组,一次执行,一组sql要么都提交成功,要么都失败。保证数据的完整性,mysql中只有i使用nnodb引擎的数据库或表支持事务。

事务特性

原子性:一个事务中的多条sql要么都执行成功,要么都失败,回滚到执行前的状态。

隔离性:数据库中的事物可以多个同时执行,有读未提交、读已提交、可重复读和串行化四种。

持久性:事务提交后,保证数据永久保存,即使宕机。

一致性:保证数据是完整可靠的,原子性、隔离性、持久性都是为了保证数据的一致性。

事务设置

关闭自动事务提交:

set global autocommit = 0;

查看事务自动提交开启的情况:

show  global  varlables like 'autocommit';

-- 开启事务:

begin;

       (sql语句)

rollback;-- 事务回滚

commit; -- 事务提交

事务隔离级别

查看事务的隔离级别:

SELECT @@session.transaction_isolation,@@transaction_isolation;

1.读未提交

 SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

 另一个事务正在更改数据,但还没有提交事务,该事物若读取数据,可能造成脏读,不可重复读,幻读。

2.读已提交

 SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED

一个事务只能读到另一个事务提交后的数据,解决了脏读问题,但还存在不可重复读,幻读。 

不可重复读:

         一个事务在执行事务时,先后读两次,两次结果不相同。

3.可重复读

 SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ

一个事务在执行时,多次读取数据是一致的。

解决了不可重复读问题,但是幻读问题没有完全解决。

例如下图,事务1不加for update 执行时,事务2添加一行记录后事务1不会幻读,当事务2提交后,事务1若有for update则会出现幻读。

幻读:

 一个事务读取到的数据量不同(insert delete)

4.串行化

 事务只能一个一个进行,即使一个事务写,另一个事务读不可以,但是读读可以,读写不可以。

SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE 

事务实现原理

原子性:undolog

mysql使用undolog日志文件,用来记录增删改操作的反向作

insert delete

delete insert

update update

出现异常,事务回滚,执行对应操作的反向操作。

持久性:redolog

redolog

当数据库事务提交后,保证数据是不可撤销。

当sql发送到mysql后,事务还未提交之前,如果发生断电/宕机

会将sql保存到redolog日志文件中

在mysql重启时 执行redolog中的sql

隔离性:

MVCC:多版本并发控制,每次事务对某记录操作时,会生成一个操作的版本链

如果隔离级别是读已提交

在同一个事务中,每次读取时都会从版本链上生成一个快照(readView)

 每次读到得是查询时最新的数据。也称为当前读。

如果隔离级别是可重复读

在事务第一次读取数据时,会从版本链上生成一个快照(readView)

之后再次读取时,仍然会从上次的版本快照中读,

所以隔离级别是可重复读,也称为快照读。

  • 34
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小俱的一步步

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值