Mysql使用了一个平面事务模型:嵌套的事务是不允许的,在第一个里面使用start transaction或者begin之后,第二个事务开始的时候,
自动的提交第一个事务。同样,许多其他的Mysql命令运行的时候都会隐藏的执行一个commit命令,下面是一个列表:
DROP DATABASE/DROP TABLE
CREATE INDEX/DROP INDEX
ALTER TABLE/RENAME TABLE
LOCK TABLES/UNLOCK TABLES
SET AUTOCOMMIT=1
Mysql4.0.14和4.1.1,支持保存点,可以在事务中关键的地方做标记,需要的话可以部分撤销。
Mysql提供了两个变量控制事务行为---AUTOCOMMIT 和 TRANSACTION ISOLATION LEVEL
默认情况下是自动提交的,SET AUTOCOMMIT=0可以关掉自动提交,如果退出没有提交,则自动回滚。
通过SELECT @@AUTOCOMMIT;
取得当前的自动提交模式。
mysql> select @@AUTOCOMMIT;
+--------------+
| @@AUTOCOMMIT |
+--------------+
| 1 |
+--------------+
1 row in set (0.00 sec)
事务孤立性
Mysql提供了四种孤立级别:
序列化(SERIALIZABLE)
可重复读(REPEATABLE READ)
提交的读(READ COMMITTED)
未提交的读(READ UNCOMMITTED)
序列化:
提供最大程度的隔离,如果每个事务都以这种孤立级运行就会影响Mysql的性能,因为需要大量的资源来使大量事务在任一时刻不被看到。
可重复读:
看起来和序列化的孤立级别很相似。
有一个很重要的不同点:虽然一个事务不能看到其他正在执行的当前事务做出的变化,但是它可以看到新的纪录(其他事务添加到数据库的)。
提交的读:
安全性比可重复读要差。
不仅处于这一级的事务可以看到其他事务添加的新纪录,而且其他事务对现存纪录做出的修改一旦被提交,也可以看到。
也就是说,这意味着在事务处理期间,如果其他事务修改了相应的表,那么同一个事务的多个select语句可能返回不同的结果。
未提交的读:
提供了事务之间最小程度的隔离。除了容易产生虚幻的读操作和不能重复的读操作外,处于这个孤立级的事务可以读到其他事务还没有提交的
数据。如果这个事务使用其他事务未提交的变化作为计算的基础,然后那些未提交的变化被他们的父事务撤销,则导致了大量的数据变化。
可以通过
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
修改孤立级别。
默认是可重复读的
取得当前的孤立级别:
mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)
默认情况下,这个变量的值是基于每个会话设置的,但是可以通过添加global关键字对所有的会话进行全局设置。
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
需要super优先权执行这个操作。
具有非事物表的伪事务
InnoDB和BDB表支持事物的概念,MyISAM表类型不支持这些锁定机制。所以要明确设置表锁定,以避免同时存在的事物互相侵犯空间。
Mysql提供了以下实现表锁定的句法:
LOCK TABLES table-name lock-type,....
解锁命令:
UNLOCK TABLES;
不用指定解锁的表名。
有两种类型的表锁定:读锁定和写锁定。
读锁定:
表的读锁定是指设置锁定的线程可以从表中读数据,其他线程也可以。不过每个线程都不能修改锁定的表,只要锁定处于活动状态就不能添加、
更新或者删除纪录。
READ锁定的一个变体是READ LOCAL锁定,它和常规的READ锁定是不同的,因为其他线程可以执行INSERT语句,它和初始化锁定的线程拥有的
会话不冲突。它是为了使用mysqldump工具对一个表同时进行多个INSERT操作而创建的。
写锁定:
表的写锁定是指设置锁定的线程可以修改表中的数据,但是其他线程在锁定期间既不能从表中读数据也不能写数据。
锁定的优先权:
在同时涉及到WRITE和READ锁定的情况下,MYSQL对于写锁定分配较高的优先级来保证对于表的修改可以尽快地保存到磁盘上。这就降低了
磁盘崩溃或者系统失败导致更新丢失的危险。
表锁定重要的缺点之一:
如果一个线程不释放它的锁定,其他试图访问这个已锁定表的尝试都会超时等待,导致了整体性能很大程度的降低。
相关推荐
### MySQL事务的隔离性 #### 一、事务与MySQL架构 **事务**是数据库管理系统执行过程中的一系列逻辑操作,这些操作作为一个完整的单元被执行。如果事务内的所有操作都成功完成,则整个事务成功;如果其中一个操作...
MySQL事务隔离级别是数据库管理系统中一个非常重要的概念,它关系到数据的一致性和并发性能。在MySQL中,事务被用于确保数据库操作的原子性、一致性、隔离性和持久性(ACID特性)。事务隔离级别主要涉及四个方面:读...
### MySQL 事务的基本...通过对MySQL事务的理解和掌握,我们可以更好地利用其强大的功能来提高应用程序的稳定性和可靠性。通过本篇文章的学习,相信读者已经对MySQL事务的基本原理、特点以及使用方法有了全面的认识。
在这个"mysql事务学习资料(PPT+源码)"中,你将深入理解MySQL事务的概念、类型、特性和实际应用。 1. **事务概念**:在数据库中,事务是一系列操作的集合,这些操作要么全部成功,要么全部回滚,以保持数据的一致性...
### MySQL事务处理用法与实例详解 #### 一、事务的概念及重要性 在数据库管理中,事务(Transaction)是指一系列作为一个整体的操作序列。这些操作要么全部成功,要么全部失败,不能只执行其中的一部分。事务处理...
以下是对`jdbc+spring+mysql事务理解和分析`的详细说明: 1. **原子性(Atomicity)**:这是事务的基本特性,表示事务中的所有操作要么全部成功,要么全部回滚。如果在事务执行过程中发生错误,数据库会撤销所有已...
在深入探讨MySQL事务和锁的原理之前,我们首先需要对“事务”的概念有一个基本的理解。事务是一组操作的集合,这些操作要么全部完成,要么全部不做,确保数据库从一种一致性状态转换到另一种一致性状态,而不会留下...
深入理解Mysql事务隔离级别与锁机制 Mysql事务隔离级别与锁机制是数据库系统中非常重要的概念,它们都是为了解决多事务并发问题而设计的。下面我们将深入讲解这些机制,让大家彻底理解数据库内部的执行原理。 事务...
关于mysql的事务处理 public static void StartTransaction(Connection con, String[] sqls) throws Exception { if (sqls == null) { return; } Statement sm = null; try { // 事务开始 System....
超高并发下如何对Mysql事务进行优化
MySQL 事务管理是数据库操作的重要组成部分,特别是在处理关键数据和多步骤操作时,确保数据的一致性和完整性至关重要。事务提供了原子性、一致性、隔离性和持久性的保障,这四个特性通常被简称为ACID属性。 原子性...
MySQL 事务是指一组操作的集合,保证了数据库的完整性和一致性。事务可以分为四个阶段:开始事务、执行事务、提交事务、回滚事务。 MySQL 函数 MySQL 函数是指可以在 MySQL 中使用的函数,包括字符串函数、数字...
"Java实现的mysql事务处理操作示例" 本文主要介绍了Java实现的mysql事务处理操作,结合实例形式较为详细的分析了Java基于JDBC操作mysql数据库实现事务处理的相关概念、操作技巧与注意事项。 事务处理是数据库操作...
MySQL 事务表与非事务表是数据库管理中的两种基本类型,它们主要的区别在于对数据一致性和安全性提供的保障程度。在MySQL中,这两种类型的表在处理数据操作时有不同的机制。 首先,事务表,如InnoDB存储引擎提供的...
MySQL事务是数据库操作的核心概念,尤其对于保证数据的一致性和完整性至关重要。在MySQL中,事务是一组数据库操作,这些操作被视为一个单元,要么全部成功,要么全部回滚,以确保数据库状态的一致性。本资料“mysql...
nodejs + mysql 事物处理问题 呵呵 看了就知道 记得npm install啊 需要的东西啊 本想免费 苦于没积分 ,需要的的同学,给点分吧
MySQL 事件、触发器、事务实验报告 MySQL 事件调度器是 MySQL 中的一种机制,可以根据指定的时间间隔执行特定的 SQL 语句。事件调度器有两个优点:一是可以用于定期统计、清理、检查等操作;二是可以提高数据库的...