1.mysql从4.1就开始支持事务处理了 但是只有innodb和BDB存储引擎才支持事务。
2.事务都应该具备ACID特征。所谓ACID是Atomic(原子性),Consistent(一致性),Isolated(隔离性),Durable(持续性)四个词的首字母所写,下面以“银行转帐”为例来分别说明一下它们的含义:
原子性:组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分。换句话说,事务是不可分割的最小单元。比如:银行转帐过程中,必须同时从一个帐户减去转帐金额,并加到另一个帐户中,只改变一个帐户是不合理的。
一致性:在事务处理执行前后,数据库是一致的。也就是说,事务应该正确的转换系统状态。比如:银行转帐过程中,要么转帐金额从一个帐户转入另一个帐户,要么两个帐户都不变,没有其他的情况。
隔离性:一个事务处理对另一个事务处理没有影响。就是说任何事务都不可能看到一个处在不完整状态下的事务。比如说,银行转帐过程中,在转帐事务没有提交之前,另一个转帐事务只能处于等待状态。
持续性:事务处理的效果能够被永久保存下来。反过来说,事务应当能够承受所有的失败,包括服务器、进程、通信以及媒体失败等等。比如:银行转帐过程中,转帐后帐户的状态要能被保存下来。
3.在事务里面的SELECT语句没有锁的行为 但是为了有锁我们可以在SQL后面加for update这样SELECT语句就加了行锁。如:
BEGIN;
SELECT book_number FROM book WHERE book_id = 123 FOR UPDATE;
// ...
UPDATE book SET book_number = book_number - 1 WHERE book_id = 123;
COMMIT;
-------------------------------------------------------------------------------
由于加入了FOR UPDATE,所以会在此条记录上加上一个行锁,如果此事务没有完全结束,那么其他的事务在使用SELECT ... FOR UPDATE请求的时候就会处于等待状态,直到上一个事务结束,它才能继续,从而避免了问题的发生,需要注意的是,如果你其他的事务使用的是不带FOR UPDATE的SELECT语句,将得不到这种保护。
4.
MySQL/InnoDB通过行级锁来最小化锁竞争。这样修改同一table里其他行的数据没有限制,而且读数据可以始终没有等待。
可以在SELECT语句里使用FOR UPDATE或LOCK IN SHARE MODE语句来加上行级锁
SELECT select_statement options [FOR UPDATE|LOCK IN SHARE MODE]
FOR UPDATE会锁住该SELECT语句返回的行,其他SELECT和DML语句必须等待该SELECT语句所在的事务完成
LOCK IN SHARE MODE同FOR UPDATE,但是允许其他session的SELECT语句执行并允许获取SHARE MODE锁
5.事务设计指南
1,保持事务短小
2,尽量避免事务中rollback
3,尽量避免savepoint
4,默认情况下,依赖于悲观锁
5,为吞吐量要求苛刻的事务考虑乐观锁
6,显示声明打开事务
7,锁的行越少越好,锁的时间越短越好
6.
事务 ACID Atomicity(原子性)、Consistency(稳定性)、Isolation(隔离性)、Durability(可靠性)
1、事务的原子性
一组事务,要么成功;要么撤回。
2、稳定性
有非法数据(外键约束之类),事务撤回。
3、隔离性
事务独立运行。
一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。
事务的100%隔离,需要牺牲速度。
4、可靠性
软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。
可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit选项 决定什么时候吧事务保存到日志里。
开启事务
START TRANSACTION 或 BEGIN
提交事务(关闭事务)
COMMIT
放弃事务(关闭事务)
ROLLBACK
折返点
SAVEPOINT adqoo_1
ROLLBACK TO SAVEPOINT adqoo_1
发生在折返点 adqoo_1 之前的事务被提交,之后的被忽略
事务的终止
设置“自动提交”模式
SET AUTOCOMMIT = 0
每条SQL都是同一个事务的不同命令,之间由 COMMIT 或 ROLLBACK隔开
掉线后,没有 COMMIT 的事务都被放弃
事务锁定模式
系统默认: 不需要等待某事务结束,可直接查询到结果,但不能再进行修改、删除。
缺点:查询到的结果,可能是已经过期的。
优点:不需要等待某事务结束,可直接查询到结果。
需要用以下模式来设定锁定模式
1、SELECT …… LOCK IN SHARE MODE(共享锁)
查询到的数据,就是数据库在这一时刻的数据(其他已commit事务的结果,已经反应到这里了)
SELECT 必须等待,某个事务结束后才能执行
2、SELECT …… FOR UPDATE(排它锁)
例如 SELECT * FROM tablename WHERE id<200
那么id<200的数据,被查询到的数据,都将不能再进行修改、删除、SELECT …… LOCK IN SHARE MODE操作
一直到此事务结束
共享锁 和 排它锁 的区别:在于是否阻断其他客户发出的 SELECT …… LOCK IN SHARE MODE命令
3、INSERT / UPDATE / DELETE
所有关联数据都会被锁定,加上排它锁
4、防插入锁
例如 SELECT * FROM tablename WHERE id>200
那么id>200的记录无法被插入
5、死锁
自动识别死锁
先进来的进程被执行,后来的进程收到出错消息,并按ROLLBACK方式回滚
innodb_lock_wait_timeout = n 来设置最长等待时间,默认是50秒
事务隔离模式
SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL
READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE
1、不带SESSION、GLOBAL的SET命令
只对下一个事务有效
2、SET SESSION
为当前会话设置隔离模式
3、SET GLOBAL
为以后新建的所有MYSQL连接设置隔离模式(当前连接不包括在内)
隔离模式
READ UNCOMMITTED
不隔离SELECT
其他事务未完成的修改(未COMMIT),其结果也考虑在内
READ COMMITTED
把其他事务的 COMMIT 修改考虑在内
同一个事务中,同一 SELECT 可能返回不同结果
REPEATABLE READ(默认)
不把其他事务的修改考虑在内,无论其他事务是否用COMMIT命令提交过
同一个事务中,同一 SELECT 返回同一结果(前提是本事务,不修改)
SERIALIZABLE
和REPEATABLE READ类似,给所有的SELECT都加上了 共享锁
分享到:
相关推荐
根据提供的文件信息,本文将详细解释MySQL事务处理的相关知识...以上就是关于MySQL事务处理的学习资料及示例说明,希望对你有所帮助。通过理解和掌握这些基本概念和操作,你可以更好地利用MySQL的强大功能来管理数据。
在这个"mysql事务学习资料(PPT+源码)"中,你将深入理解MySQL事务的概念、类型、特性和实际应用。 1. **事务概念**:在数据库中,事务是一系列操作的集合,这些操作要么全部成功,要么全部回滚,以保持数据的一致性...
MySQL事务隔离级别是数据库管理系统中一个非常重要的概念,它关系到数据的一致性和并发性能。在MySQL中,事务被用于确保数据库操作的原子性、一致性、隔离性和持久性(ACID特性)。事务隔离级别主要涉及四个方面:读...
本文实例讲述了php实现mysql事务处理的方法。分享给大家供大家参考。具体分析如下: 要实现本功能的条件是环境 mysql 5.2 /php 5 支持事务的table 类型,需要InnoDB,有了这些条件你就可以做上面的实现了,这个事物回滚...
首先,从标题我们可以推断,这份资料可能涵盖了MySQL的基础到进阶内容,包括安装配置、SQL语言基础、表设计、索引优化、事务处理、存储过程、触发器、视图、备份恢复、性能调优等多个方面。 描述中提到,这些资料是...
### MySQL 事务的基本使用——基本原理及特点 ACID #### 一、事务的概念与作用 在数据库管理系统中,事务(Transaction...通过本篇文章的学习,相信读者已经对MySQL事务的基本原理、特点以及使用方法有了全面的认识。
封装了java使用jdbc对mysql的操作,以及java使用jdbc对mysql的事务处理,对execute、executeUpdate、executeQuery进行了封装,把繁琐的创建数据库连接对象、PreparedStatement对象、结果集对象,打开关闭连接进行了...
在易语言的学习过程中,进阶事务处理是提升技能的重要环节。事务处理通常涉及到数据库操作、多线程、错误处理和程序流程控制等复杂技术,对于软件的稳定性和效率有着至关重要的作用。 在这个“易语言学习进阶事务...
在本文中,我们将深入探讨MySQL的事务处理、预编译查询的概念,以及Perl DBI模块如何简化这些操作。 首先,让我们了解一下MySQL中的事务。事务是数据库操作的基本单位,它确保一组操作要么全部成功,要么全部失败,...
6. 事务处理:理解ACID(原子性、一致性、隔离性和持久性)原则,学习如何使用BEGIN、COMMIT、ROLLBACK进行事务管理。 7. 安全性:了解如何设置用户权限、GRANT和REVOKE命令,以及如何加密数据以保护数据库安全。 ...
MySQL事务是数据库操作的核心概念,尤其对于保证数据一致性至关重要。事务是数据库系统执行逻辑操作的基本单位,具有四个关键特性:原子性、一致性、隔离性和持久性。 1. 原子性(Atomicity):原子性确保事务中的...
MySQL系统学习教程主要涵盖数据库的基础概念、安装与配置、数据类型、SQL语句、表的操作、索引、视图、存储过程与函数、事务处理、备份与恢复、性能优化等多个方面。以下是对这些知识点的详细解释: 1. **数据库...
InnoDB是MySQL中最常用且支持事务处理的存储引擎,提供了行级锁定和外键支持。这本书深入解析了InnoDB的工作原理,包括表空间、页、索引结构、锁机制、事务处理和恢复机制等。通过阅读这本书,读者可以更好地理解...
本笔记涵盖了 MySQL 的多个方面,包括 MySQL 的配置、性能优化、索引管理、事务处理等。 首先,本笔记从 MySQL 的基本配置开始,介绍了 master-data 的配置、mysql key_buffer_size 的设置、Slave_IO_Running 和 ...
总的来说,这个项目展示了如何利用Spring的事务管理能力,结合JOTM作为事务协调器,以及iBATIS作为数据访问层,实现基于MySQL的JTA分布式事务处理。这不仅有助于理解分布式事务的原理,也为实际开发提供了可参考的...
在VB(Visual Basic 6)中与...通过分析这些文件,我们可以学习如何在VB6中构建一个简单的数据库应用,包括数据库连接、SQL命令的执行以及数据的处理。如果想要深入理解这个项目,需要打开并研究每个文件的具体内容。
在事务处理中,存储过程能够确保一组操作的原子性,即使在发生错误时也能保持数据的一致性。 在实际应用中,存储过程广泛用于业务逻辑复杂的场景,如数据清洗、报表生成、批处理操作等。例如,一个存储过程可能用于...
接下来,我们来看看如何使用Java的JDBC API来操作MySQL事务。在Java中,`Connection`对象提供了`setAutoCommit(false)`方法来禁用自动提交,这样就可以手动控制事务的开始、提交和回滚。以下是一个简单的示例: ```...
- **MySQL**:作为一款强大的数据库系统,MySQL提供了高效的数据存储和检索能力,支持事务处理、多用户访问控制等特性,是构建动态网站不可或缺的一部分。 2. **JavaScript 的应用**:介绍了如何通过添加...