MYSQL事务(transaction)

来源:互联网 发布:普通话发音矫正软件 编辑:程序博客网 时间:2024/06/09 00:09

1.什么是mysql事务?

      事务是一个最小的、不可分割的工作单元,不论成功与否都作为一个整体进行工作。(我们可以把一系列的操作看成是事务,最经典的例子是“银行转帐”)。

2.事务都应该具有哪些特性?

     事务都应该具备ACID特征。所谓ACID是Atomic(原子性),Consistent(一致性),Isolated(隔离性),Durable(持久性)四个词的首字母所写,下面以“银行转帐”为例来分别说明一下它们的含义:

    原子性:组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分。换句话说,事务是不可分割的最小单元。比如:银行转帐过程中,必须同时从一个帐户减去转帐金额,并加到另一个帐户中,只改变一个帐户是不合理的。

一致性:在事务处理执行前后,MySQL数据库是一致的。也就是说,事务应该正确的转换系统状态。比如:银行转帐过程中,要么转帐金额从一个帐户转入另一个帐户(在不考虑转账费用的情况下,转账方减少的金额与收账方的增加的金额应该是相等),要么两个帐户都不变,没有其他的情况。

   隔离性:一个事务处理对另一个事务处理没有影响。就是说任何事务都不可能看到一个处在不完整状态下的事务。比如说,银行转帐过程中,在转帐事务没有提交之前,另一个转帐事务只能处于等待状态。

   持久性:事务处理的效果能够被永久保存下来。反过来说,事务应当能够承受所有的失败,包括服务器、进程、通信以及媒体失败等等。比如:银行转帐过程中,转帐后帐户的状态要能被保存下来。

3.mysql怎么使用事务.

   使用事务需要存储引擎的支持。因此在使用事务前,我们需要了解存储引擎。

   存储引擎(MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。例如,如果你在研究大量的临时数据,你也许需要使用内存存储引擎。内存存储引擎能够在内存中存储所有的表格数据。又或者,你也许需要一个支持事务处理的数据库(以确保事务处理不成功时数据的回退能力)这些不同的技术以及配套的相关功能在MySQL中被称作存储引擎(也称作表类型)。

   Mysql存储引擎

   MyISAM: Mysql的默认数据库,最为常用。拥有较高的插入,查询速度,但不支持事务

  InnoDB :事务型数据库的首选引擎,支持ACID事务,支持行级锁定
  BDB: 源自Berkeley DB,事务型数据库的另一种选择,支持COMMIT和ROLLBACK等其他事务特性
  Memory :所有数据置于内存的存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。并且其内容会在Mysql重新启动时丢失
  Merge :将一定数量的MyISAM表联合而成一个整体,在超大规模数据存储时很有用
  Archive :非常适合存储大量的独立的,作为历史记录的数据。因为它们不经常被读取。Archive拥有高效的插入速度,但其对查询的支持相对较差
  Federated: 将不同的Mysql服务器联合起来,逻辑上组成一个完整的数据库。非常适合分布式应用 Cluster/NDB :高冗余的存储引擎,用多台数据机器联合提供服务以提高整体性能和安全性。适合数据量大,安全和性能要求高的应用
  CSV: 逻辑上由逗号分割数据的存储引擎。它会在数据库子目录里为每个数据表创建一个.CSV文件。这是一种普通文本文件,每个数据行占用一个文本行。CSV存储引擎不支持索引。
  BlackHole :黑洞引擎,写入的任何数据都会消失,一般用于记录binlog做复制的中继
  另外,Mysql的存储引擎接口定义良好。有兴趣的开发者通过阅读文档编写自己的存储引擎。

   Mysql支持事务的存储引擎有:BDB、InnoDB,如果我需要使用存储引擎则数据库数据使用的存储引擎应该是以上两种。

   事务处理基本格式:

 1.start transaction(开启事务)

2.sql语句(这里要注意一些sql语句会造成事务的隐式提交,文章最后有详细说明

3.commit/rollback(提交或回滚)

现在来一个实例(经典银行转账):

create table account (
account_id int(10) not null auto_increment,
account_name varchar(20),
account_amount decimal(5,2),
        primary key(account_id)

)engine=innodb charset=utf8;

insert into account values(null,'张三',500.00);

insert into account values(null,'李四',500.00);

start transaction;

update account set account_amount=600.00 where account_id=2;

update account set account_amount=400.00 where account_id=1;

--执行完上面两个sql语句后,大家可以打开一个新的命令行窗口查看张三和李四的金额是否变少。

commint;

--commit后呢?大家可以打开一个新的命令行窗口查看张三和李四的金额是否变少。

--如果commit那里输入的rollback呢?大家可以打开一个新的命令行窗口查看张三和李四的金额是否变少。

提示:会造成隐式提交的语句 
以下语句(以及同义词)均隐含地结束一个事务,似乎是在执行本语句前,您已经进行了一个COMMIT。
(1)ALTER FUNCTION, ALTER PROCEDURE, ALTER TABLE, BEGIN, CREATE DATABASE, CREATE FUNCTION, CREATE INDEX, CREATE PROCEDURE, CREATE TABLE, DROP DATABASE, DROP FUNCTION, DROP INDEX, DROP PROCEDURE, DROP TABLE, LOAD MASTER DATA, LOCK TABLES, RENAME TABLE, SET AUTOCOMMIT=1, START TRANSACTION, TRUNCATE TABLE, UNLOCK TABLES. 
(2) 当当前所有的表均被锁定时,UNLOCK TABLES可以提交事务。
(3)  CREATE TABLE, CREATE DATABASE DROP DATABASE, TRUNCATE TABLE, ALTER FUNCTION, ALTER PROCEDURE, CREATE FUNCTION, CREATE PROCEDURE, DROP FUNCTION和DROP PROCEDURE等语句会导致一个隐含提交。
(4) InnoDB中的CREATE TABLE语句被作为一个单一事务进行处理。这意味着,来自用户的ROLLBACK不会撤销用户在事务处理过程中创建的CREATE TABLE语句。
事务不能被嵌套。这是隐含COMMIT的结果。当您发布一个START TRANSACTION语句或其同义词时,该COMMIT被执行,用于任何当前事务。


 


原创粉丝点击