MySQL事务

MySQL事务,第1张

概述MySQL事务以及事务隔离级别 MySQL事务主要用于处理 *** 作量大,复杂度高的数据。比如在人员管理系统中,你删除一个人员,你就要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等,这些数据

<h2 ID="MysqL事务以及事务隔离级别">MysqL事务以及事务隔离级别

MysqL事务主要用于处理 *** 作量大,复杂度高的数据。比如在人员管理系统中,你删除一个人员,你就要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等,这些数据库 *** 作语句就构成了一个事务

MysqL中只有使用了Innodb数据库引擎的数据库或表才支持事务事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行事务用来管理insert,update,delete语句一般来说,事务必须满足4个条件:原子性,一致性,隔离性,持久性原子性:一个事务中所有 *** 作,要么全部执行,要么全部不执行不会结束在中间某个环节。事务在执行过程中发生错误会被回滚到事务开始前的状态一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,包含资料的精确度,串联性以及后续数据库可以自发性的完成预定的工作隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读取未提交内容,读取提交内容,可重复读和可串行化持久化:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失

在MySQL命令行的默认是设置下,事务都是自动提交的,即执行SQL语句后就会马上执行COMMIT *** 作。因此要显式的开启一个事务需要使用命令BEGIN或START TRANSACTION,或者执行命令SET autoCOMMIT=0,用来禁止使用当前绘画的自动提交

BEGIN或START TRANSACTION;显式地开启一个事务COMMIT;也可以使用COMMIT WORK,二者等价的。COMMIT会提交事务,并使已对数据库进行的所有修改成为永久性RolLBACK;也可以使用RolLBACK WORK,二者等价。回滚会结束用户的事务,并撤回正在进行的所有未提交的修改SAVEPOINT IDentifIEr;SAVEPOINT允许在事务中创建一个保存点,一个事务可以有多个SAVEPOINTRELESE SAVEPOINT IDentifIEr;删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常RolLBACK TO IDentifIEd;把事务回滚到标记点SET TRANSACTION;用来设置事务的隔离级别。InnoDB存储引擎提供事务隔离级别有READ UNCOMMITTED,READ COMMITTED,REPEAtable READ和SERIAliZABLE用BEGIN,RolLBACK,COMMIT来实现BEGIN开始一个事务RolLBACK事务回滚COMMIT事务确认直接SET来改变MysqL的自动提交模式:SET autoCOMMIT=0禁止自动提交SET autoCOMMIT=1开启自动提交事务A跟事务B之间具有一定的隔离性read uncommited 读未提交在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用。读取未提交的数据称为脏数据read COMMIT大多数数据库系统的默认隔离级别(但不是MysqL)。一个事务只能看见已经提交事务所作的改变。其避免了脏读,但仍然存在不可重复读和幻读问题repeatable readMysqL的默认级别;确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。避免了脏读和不可重复读,但是会导致另一个问题:幻读。幻读是指用户读取某一个范围的数据行时,另一个事务又在该范围插入了新行,当用户再读取该范围的数据行时,会发现新的幻影行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC)机制解决了该问题可重复读的隔离级别下使用了MVCC机制,select *** 作不会更新版本号,是快照读(历史版本);insert,update和delete会更新版本号,是当前读(当前版本)serializable最高隔离级别,通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争在my.cnf文件设置
- read-uncommitted- READ-COMMITED- REPEAtable-READ- SERIAliZABLE* 例如[MysqLID]transaction-isolation = READ-COMMITTED
通过命令动态设置隔离级别
SET [GLOBAL|SESSION] TRANSACTION ISolATION LEVEL 其中isolation-level可以是:- READ UNCOMMITTED- READ COMMITTED- REPEAtable READ- SERIAliZABLE

GLOBAL|SESSION表示事务隔离级别的作用范围:
GLOBAL:表示对所有会话有效
SESSION:表示对当前会话有效


<h3 ID="事务并发问题">事务并发问题

脏读:事务A读取了事务B更新的数据,然后B回滚 *** 作,那么A读取到的数据是脏数据不可重复读:事务A多次读取到同一数据,事务B在事务A多次读取过程中,对数据做了更新并未提交,导致事务A多次读取同一条数据,结果不一致幻读:前后读取的结果数据条数不一致。这是因为事务A的多次读取过程中,事务B对表进行插入或删除 *** 作 总结

以上是内存溢出为你收集整理的MySQL事务全部内容,希望文章能够帮你解决MySQL事务所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1169279.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存