本文介绍: 一次对数据库操作过程,有多条sql,视为一组,一次执行,一组sql要么都提交成功,要么都失败。例如下图,事务1不加for update 执行时,事务2添加一行记录后事务1不会幻读,当事务2提交后,事务1若有for update则会出现幻读。另一个事务正在更改数据,但还没有提交事务,该事物若读取数据,可能造成脏读,不可重复读,幻读。事务只能一个一个进行,即使一个事务写,另一个事务读不可以,但是读读可以,读写不可以。一个事务只能读到另一个事务提交后的数据,解决了脏读问题,但还存在不可重复读,幻读。

目录

事务

数据库事务

事务特性

事务设置

事务隔离级别

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)

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

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

原文地址:https://blog.csdn.net/weixin_63541561/article/details/135853023

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_61907.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注