如果您想了解MySQL事务和mysql事务的隔离级别的知识,那么本篇文章将是您的不二之选。我们将深入剖析MySQL事务的各个方面,并为您解答mysql事务的隔离级别的疑在这篇文章中,我们将为您介绍My
如果您想了解MySQL事务和mysql事务的隔离级别的知识,那么本篇文章将是您的不二之选。我们将深入剖析MySQL事务的各个方面,并为您解答mysql事务的隔离级别的疑在这篇文章中,我们将为您介绍MySQL事务的相关知识,同时也会详细的解释mysql事务的隔离级别的运用方法,并给出实际的案例分析,希望能帮助到您!
本文目录一览:- MySQL事务(mysql事务的隔离级别)
- mysql 锁表锁行语句分享(MySQL事务处理)
- MYSQL---mysql事务原理分析(收藏)
- mysqli执行mysql事务的有关问题
- mysqli执行mysql事务的问题
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允许在事务中创建一个保存点,一个事务可以有多个SAVEPOINT
-
RELESE SAVEPOINT identifier;删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常
-
ROLLBACK TO identified;把事务回滚到标记点
-
SET TRANSACTION;用来设置事务的隔离级别。InnoDB存储引擎提供事务隔离级别有READ UNCOMMITTED,READ COMMITTED,REPEATABLE READ和SERIALIZABLE
方法">MysqL事务处理主要有两种方法:
- 用BEGIN,ROLLBACK,COMMIT来实现
- BEGIN开始一个事务
- ROLLBACK事务回滚
- COMMIT事务确认
- 直接SET来改变MysqL的自动提交模式:
- SET AUTOCOMMIT=0禁止自动提交
- SET AUTOCOMMIT=1开启自动提交
- 事务A跟事务B之间具有一定的隔离性
- read uncommited 读未提交
- 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用。读取未提交的数据称为脏数据
- read COMMIT
- 大多数数据库系统的默认隔离级别(但不是MysqL)。一个事务只能看见已经提交事务所作的改变。其避免了脏读,但仍然存在不可重复读和幻读问题
- repeatable read
- MysqL的默认级别;确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。避免了脏读和不可重复读,但是会导致另一个问题:幻读。幻读是指用户读取某一个范围的数据行时,另一个事务又在该范围插入了新行,当用户再读取该范围的数据行时,会发现新的幻影行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC)机制解决了该问题
- 可重复读的隔离级别下使用了MVCC机制,select操作不会更新版本号,是快照读(历史版本);insert,update和delete会更新版本号,是当前读(当前版本)
- serializable
- 最高隔离级别,通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争
- 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用。读取未提交的数据称为脏数据
- 大多数数据库系统的默认隔离级别(但不是MysqL)。一个事务只能看见已经提交事务所作的改变。其避免了脏读,但仍然存在不可重复读和幻读问题
- MysqL的默认级别;确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。避免了脏读和不可重复读,但是会导致另一个问题:幻读。幻读是指用户读取某一个范围的数据行时,另一个事务又在该范围插入了新行,当用户再读取该范围的数据行时,会发现新的幻影行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC)机制解决了该问题
- 可重复读的隔离级别下使用了MVCC机制,select操作不会更新版本号,是快照读(历史版本);insert,update和delete会更新版本号,是当前读(当前版本)
- 最高隔离级别,通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争
- 在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="事务并发问题">事务并发问题
- 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:表示对当前会话有效
- 脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
- 不可重复读:事务A多次读取到同一数据,事务B在事务A多次读取过程中,对数据做了更新并未提交,导致事务A多次读取同一条数据,结果不一致
- 幻读:前后读取的结果数据条数不一致。这是因为事务A的多次读取过程中,事务B对表进行插入或删除操作
mysql 锁表锁行语句分享(MySQL事务处理)
下面这个语句是锁定一行数据,开始读取,一直到删除后都不会有第二个人也读到这条数据
代码如下:
mysql_query("set autocommit=0");
$list_one = $db->fetch_first("select * from prizes where id = ".$id." FOR UPDATE");
$db->query("DELETE from prizes WHERE id =".$list_one[''id'']);
mysql_query("commit");
START TRANSACTION, COMMIT和ROLLBACK语法
代码如下:
START TRANSACTION | BEGIN [WORK]
COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
SET AUTOCOMMIT = {0 | 1}
START TRANSACTION或BEGIN语句可以开始一项新的事务。COMMIT可以提交当前事务,是变更成为永久变更。ROLLBACK可以 回滚当前事务,取消其变更。SET AUTOCOMMIT语句可以禁用或启用默认的autocommit模式,用于当前连接。
自选的WORK关键词被支持,用于COMMIT和RELEASE,与CHAIN和RELEASE子句。CHAIN和RELEASE可以被用于对事务完成进行附加控制。Completion_type系统变量的值决定了默认完成的性质。
AND CHAIN子句会在当前事务结束时,立刻启动一个新事务,并且新事务与刚结束的事务有相同的隔离等级。RELEASE子句在终止了当前事务后,会让服务器断开与当前客户端的连接。包含NO关键词可以抑制CHAIN或RELEASE完成。如果completion_type系统变量被设置为一定的值,使连锁或释放完成可以默认进行,此时NO关键词有用。
默认情况下,MySQL采用autocommit模式运行。这意味着,当您执行一个用于更新(修改)表的语句之后,MySQL立刻把更新存储到磁盘中。
如果您正在使用一个事务安全型的存储引擎(如InnoDB, BDB或NDB簇),则您可以使用以下语句禁用autocommit模式:
SET AUTOCOMMIT=0;
通过把AUTOCOMMIT变量设置为零,禁用autocommit模式之后,您必须使用COMMIT把变更存储到磁盘中,或着如果您想要忽略从事务开始进行以来做出的变更,使用ROLLBACK。
如果您想要对于一个单一系列的语句禁用autocommit模式,则您可以使用START TRANSACTION语句:
代码如下:
START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;
使用START TRANSACTION,autocommit仍然被禁用,直到您使用COMMIT或ROLLBACK结束事务为止。然后autocommit模式恢复到原来的状态。
BEGIN和BEGIN WORK被作为START TRANSACTION的别名受到支持,用于对事务进行初始化。START TRANSACTION是标准的SQL语法,并且是启动一个ad-hoc事务的推荐方法。BEGIN语句与BEGIN关键词的使用不同。BEGIN关键词可以启动一个BEGIN...END复合语句。后者不会开始一项事务。
您也可以按照如下方法开始一项事务:
START TRANSACTION WITH CONSISTENT SNAPSHOT;
WITH CONSISTENT SNAPSHOT子句用于启动一个一致的读取,用于具有此类功能的存储引擎。目前,该子句只适用于InnoDB。该子句的效果与发布一个START TRANSACTION,后面跟一个来自任何InnoDB表的SELECT的效果一样。请参见15.2.10.4节,“一致的非锁定读”。
开始一项事务会造成一个隐含的UNLOCK TABLES被执行。
为了获得最好的结果,事务应只使用由单一事务存储引擎管理的表执行。否则,会出现以下问题:
如果您使用的表来自多个事务安全型存储引擎(例如InnoDB和BDB),并且事务隔离等级不是SERIALIZABLE,则有可能当一个事务提交时,其它正在进行中的、使用同样的表的事务将只会发生由第一个事务产生的变更。也就是,用混合引擎不能保证事务的原子性,并会造成不一致。(如果混合引擎事务不经常有,则您可以根据需要使用SET TRANSACTION ISOLATION LEVEL把隔离等级设置到SERIALIZABLE。)
如果您在事务中使用非事务安全型表,则对这些表的任何变更被立刻存储,不论autocommit模式的状态如何。
如果您在更新了事务中一个事务表之后,发布一个ROLLBACK语句,则会出现一个ER_WARNING_NOT_COMPLETE_ROLLBACK警告。对事务安全型表的变更被 回滚,但是对非事务安全型表没有变更。
每个事务被存储在一个组块中的二进制日志中,在COMMIT之上。被回滚的事务不被计入日志。(例外情况:对非事务表的更改不会被 回滚。如果一个被回滚的事务包括对非事务表的更改,则整个事务使用一个在末端的ROLLBACK语句计入日志,以确保对这些表的更改进行复制。)
您可以使用SET TRANSACTION ISOLATION LEVEL更改事务的隔离等级。
回滚可以慢速运行。在用户没有明确要求时,也可以进行回滚(例如,当错误发生时)。因此,在明确地和隐含的(ROLLBACK SQL命令)回滚时,SHOW PROCESSLIST会在Stage列中显示Rolling back,用于连接。
MYSQL---mysql事务原理分析(收藏)
一、事务的基本要素(ACID)
- 1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。
- 2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。
- 3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。
- 4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。
二、事务的并发问题
- 1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据。
- 2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。
- 3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表
三、MySQL事务隔离级别
转载:https://my.oschina.net/u/3370...
mysqli执行mysql事务的有关问题
mysqli执行mysql事务的问题
<br /> public static function exec_sql_tran($arr_sql){<br /> $result=true;<br /> $con = new MySQLi(DBHOST,DB_USER,DB_PASSWD,DB_NAME);<br /> $con->autocommit(FALSE);<br /> foreach($arr_sql as $key=>$sql){<br /> if (!$con->query($sql)) {<br /> echo $con->error."<br>/";<br /> $resulf=false;<br /> $con->rollback();<br /> break;<br /> }<br /> }<br /> print_r($result);<br /> if($result){<br /> $con->commit();<br /> }<br /> else{<br /> $con->rollback();<br /> }<br /> $con->close();<br /> }<br />
$arr_sql是一个存储数据库代码的数组
我测试的时候写了两个insert的句子,第一个句子正确,第二个句子错误,当时执行下来总是发现第一个句子执行成功。
好像事务没用一样,php新手,求教了
------解决方案--------------------
MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理
------解决方案--------------------
$result=true;
$resulf=false;
看出问题了么?下面的变量名写错了
mysqli执行mysql事务的问题
$arr_sql是一个存储数据库代码的数组
我测试的时候写了两个insert的句子,第一个句子正确,第二个句子错误,当时执行下来总是发现第一个句子执行成功。
好像事务没用一样,php新手,求教了
回复讨论(解决方案)
MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理
MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理
我在mysql里面执行 show engines,看InnoDB,结果显示是支持事务的
# Engine, Support, Comment, Transactions, XA, Savepoints
''InnoDB'', ''DEFAULT'', ''Supports transactions, row-level locking, and foreign keys'', ''YES'', ''YES'', ''YES''
$result=true;
$resulf=false;
看出问题了么?下面的变量名写错了
$result=true;
$resulf=false;
看出问题了么?下面的变量名写错了
发现了,罪过罪过~
$result=true;
$resulf=false;
看出问题了么?下面的变量名写错了
还是问题,我改了代码之后,比如两个sql,sql1正确、sql2错误,用这个方法执行下来,sql1的数据还是正确插入数据库了
但是如果sql1错、sql2正确的话,两个就不能插入成功,这个其实是break的作用,但是事务的作用没有体现出来啊
$result=true;
$resulf=false;
看出问题了么?下面的变量名写错了
还是问题,我改了代码之后,比如两个sql,sql1正确、sql2错误,用这个方法执行下来,sql1的数据还是正确插入数据库了
但是如果sql1错、sql2正确的话,两个就不能插入成功,这个其实是break的作用,但是事务的作用没有体现出来啊
没看到事务开始的语句。
$con->begin_transaction();
$result=true;
$resulf=false;
看出问题了么?下面的变量名写错了
还是问题,我改了代码之后,比如两个sql,sql1正确、sql2错误,用这个方法执行下来,sql1的数据还是正确插入数据库了
但是如果sql1错、sql2正确的话,两个就不能插入成功,这个其实是break的作用,但是事务的作用没有体现出来啊
没看到事务开始的语句。
$con->begin_transaction();
mysqli里面我没有找到begin_transaction()这个方法。。。
http://www.php.net/manual/zh/mysqli.begin-transaction.php
这个是什么?
http://www.php.net/manual/zh/mysqli.begin-transaction.php
这个是什么?
这个我看到了
(PHP 5 >= 5.5.0)
mysqli::begin_transaction -- mysqli_begin_transaction ? Starts a transaction
是不是php版本要大于5.5.0才有事务的?
http://www.php.net/manual/zh/mysqli.begin-transaction.php
这个是什么? 我在代码里面调用这个方法是显示未定义的
http://www.php.net/manual/zh/mysqli.begin-transaction.php
这个是什么? 我在代码里面调用这个方法是显示未定义的
看看表的引擎吧,我怀疑不是INNODB的
http://www.php.net/manual/zh/mysqli.begin-transaction.php
这个是什么? 我在代码里面调用这个方法是显示未定义的
看看表的引擎吧,我怀疑不是INNODB的
我确定数据库的引擎是INNODB,表的怎么看~?
http://www.php.net/manual/zh/mysqli.begin-transaction.php
这个是什么? 我在代码里面调用这个方法是显示未定义的
看看表的引擎吧,我怀疑不是INNODB的
搞定了,就是表的引擎没有变过来
今天的关于MySQL事务和mysql事务的隔离级别的分享已经结束,谢谢您的关注,如果想了解更多关于mysql 锁表锁行语句分享(MySQL事务处理)、MYSQL---mysql事务原理分析(收藏)、mysqli执行mysql事务的有关问题、mysqli执行mysql事务的问题的相关知识,请在本站进行查询。
本文标签: