mysql怎么测试事物_mysql的事务

什么是事务

事务(Transaction)是访问和更新数据库的程序执行单元;事务中可能包含一个或多个sql语句,这些语句要么都执行,要么都不执行。作为一个关系型数据库,MySQL支持事务.

一个完整的业务需要批量的DML(insert、update、delete)语句共同联合完成

事务只和DML语句有关,或者说DML语句才有事务。这个和业务逻辑有关,业务逻辑不同,DML语句的个数不同

事务的四大特征

原子性

定义:原子性是指一个事务是一个不可分割的工作单位,其中的操作要么都做,要么都不做;如果事务中一个sql语句执行失败,则已执行的语句也必须回滚,数据库退回到事务前的状态。

持久性

定义:持久性是指事务一旦提交,它对数据库的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

隔离性

定义:与原子性、持久性侧重于研究事务本身不同,隔离性研究的是不同事务之间的相互影响。隔离性是指,事务内部的操作与其他事务是隔离的,并发执行的各个事务之间不能互相干扰。严格的隔离性,对应了事务隔离级别中的Serializable (可串行化),但实际应用中出于性能方面的考虑很少会使用可串行化。

一致性

定义:在事务开始和完成时,数据都必须保持一致状态。这意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性;事务结束时,所有的内部数据结构(如B树索引或双向链表)也都必须是正确的。

事务的一些术语:

开启事务:Start Transaction

事务结束:End Transaction

提交事务:Commit Transaction

回滚事务:Rollback Transaction

开启标志: 任何一条DML语句(insert、update、delete)执行,标志事务的开启

结束标志: 提交:成功的结束,将所有的DML语句操作历史记录和底层硬盘数据来一次同步

回滚:失败的结束,将所有的DML语句操作历史记录全部清空

并发事务处理带来的问题

相对于串行处理来说,并发事务处理能大大增加数据库资源的利用率,提高数据库系统的事务吞吐量,从而可以支持更多的用户。但并发事务处理也会带来一些问题,主要包括以下几种情况。

1.脏读(Dirty Reads):一个事务可以读取另一个尚未提交事务的修改数据。

2.不可重复读(Non-Repeatable Reads):同一个事务中,多次查询某个数据,却得到不同的结果。

3.幻读(Phantom Reads):一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据。

不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。

隔离性的四大隔离级别:

只有InnoDB支持事务,所以这里说的事务隔离级别是指InnoDB下的事务隔离级别

读未提交:read uncommitted

事物A和事物B,事物A未提交的数据,事物B可以读取到

这里读取到的数据叫做“脏数据”

这种隔离级别最低,这种级别一般是在理论上存在,数据库隔离级别一般都高于该级别

读已提交:read committed

事物A和事物B,事物A提交的数据,事物B才能读取到

这种隔离级别高于读未提交

换句话说,对方事物提交之后的数据,我当前事物才能读取到

这种级别可以避免“脏数据”

这种隔离级别会导致“不可重复读取”

Oracle默认隔离级别

可重复读:repeatable read

事务A和事务B,事务A提交之后的数据,事务B读取不到

事务B是可重复读取数据

这种隔离级别高于读已提交

换句话说,对方提交之后的数据,我还是读取不到

这种隔离级别可以避免“不可重复读取”,达到可重复读取

比如1点和2点读到数据是同一个

MySQL默认级别

虽然可以达到可重复读取,但是会导致“幻像读”

串行化:serializable

事务A和事务B,事务A在操作数据库时,事务B只能排队等待

这种隔离级别很少使用,吞吐量太低,用户体验差

这种级别可以避免“幻像读”,每一次读取的都是数据库中真实存在数据,事务A与事务B串行,而不并发

898030d4fb0238835b2cab5bea657d85.png

设置事务隔离级别

第一种方式

可以在my.ini文件中使用transaction-isolation选项来设置服务器的缺省事务隔离级别。

[mysqld]

transaction-isolation = READ-COMMITTE(READ-UNCOMMITTED、REPEATABLE-READ、SERIALIZABLE)

第二种方式:

通过命令动态设置隔离级别

隔离级别也可以在运行的服务器中动态设置,应使用SET TRANSACTION ISOLATION LEVEL语句。

其语法模式为:SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL 例如:SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

隔离级别可以划分为会话级、全局级

会话级:

SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

全局级:

SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值