mysql事务简单测试

Auth: jin
Date: 20140507

一、事务控制
默认情况下,MySQL是自动提交(autocommit)的,如果需要通过明确的commit和rollblack来提交和回滚事务,那么需要通过明确的事务控制命令来开始事务。
SET
AUTOCOMMIT, START TRANSACTION,COMMIT和ROLLBACK等语句支持本地事务。
1、开始一个项新的事务
START
TRANSACTION
或BEGIN语句可以开始一项新的事务。
2、提交回滚事务
COMMIT和ROLLBACK用来提交回滚事务
3、在事务提交或回滚之后的操作
CHAIN和RELEASE
字句分别用来定义在事务提交或回滚之后的操作。
CHAIN会立即开启一个新事务,并且和刚才的事务具有相同的隔离级别
RELEASE
会断开和客户端的链接。
4、修改当前的链接的提交方式
SET AUTOCOMMIT 可以修改当前的链接的提交方式,如果设置了SET
AUTOCOMMIT=0, 则设置之后的所用事务都需要通过明确的命令提交或回滚。

实例
CREATE TABLE `t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(25) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name`
(`name`)
) ENGINE=InnoDB DEFAULT
CHARSET=utf8;
注意要innodb,MyISAM不支持事务
session 1
mysql> insert into
t1(name) value (‘diege‘);
Query OK, 1 row affected (0.00 sec)

mysql> select * from t1;
+----+-------+
| id |
name |
+----+-------+
| 1 | diege |
+----+-------+
1 row in set
(0.00 sec)

session 2
mysql> select * from t1;
+----+-------+
| id | name
|
+----+-------+
| 1 | diege |
+----+-------+
1 row in set (0.00
sec)

mysql> SET AUTOCOMMIT=0;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t1(name) value (‘lily‘);
Query OK, 1 row affected
(0.00 sec)

session 1
mysql> select * from t1;
+----+-------+
| id | name
|
+----+-------+
| 1 | diege |
+----+-------+
1 row in set (0.00
sec)
数没有新的数据,因为事物没有提交。
session 2
mysql> commit;
Query OK, 0 rows
affected (0.02 sec)
session 1
mysql> select * from
t1;
+----+-------+
| id | name |
+----+-------+
| 1 | diege |
|
2 | lily |
+----+-------+
2 rows in set (0.00 sec)
提交事物后有数据了

二、事务回滚
在事务中可以通过定义SAVEPOINT,指定回滚事务的一个部分,但是不能指定提交事务的一个部分。事务回滚需要启动一个事务
session
A
mysql> select * from t1;
+----+-------+
| id | name
|
+----+-------+
| 1 | diege |
| 2 | lily |
+----+-------+
2
rows in set (0.00 sec)
mysql> SET AUTOCOMMIT=0;
Query OK, 0 rows
affected (0.00 sec)
开始一个事务
mysql> start transaction;
Query OK, 0
rows affected (0.00 sec)

mysql> insert into t1(name) value (‘tom‘);
Query OK, 1 row affected
(0.00 sec)

mysql> select * from t1;
+----+-------+
| id | name
|
+----+-------+
| 1 | diege |
| 2 | lily |
| 3 | tom
|
+----+-------+
3 rows in set (0.00 sec)

定义一个savapoint点名为backup1
mysql> savepoint backup1;
Query OK, 0 rows
affected (0.00 sec)
再插入一条数据
mysql> insert into t1(name) value (‘json‘);

Query OK, 1 row affected (0.00 sec)
mysql> select * from t1;

+----+-------+
| id | name |
+----+-------+
| 1 | diege
|
| 4 | json |
| 2 | lily |
| 3 | tom |
+----+-------+
4
rows in set (0.00 sec

回滚到刚才定义的savepoint
mysql> rollback to savepoint backup1;
Query OK, 0
rows affected (0.01 sec)
查看回滚后数据情况
mysql> select * from t1;

+----+-------+
| id | name |
+----+-------+
| 1 | diege |
| 2
| lily |
| 3 | tom |
+----+-------+
3 rows in set (0.00 sec

这时其他session session B数据情况
mysql> select * from
t1;
+----+-------+
| id | name |
+----+-------+
| 1 | diege |
|
2 | lily |
+----+-------+
2 rows in set (0.00
sec)
数据没有变化
回到session A提交事务
mysql> commit;
Query OK, 0 rows
affected (0.00 sec
session B 再查看数据
mysql> select * from
t1;
+----+-------+
| id | name |
+----+-------+
| 1 | diege |
|
2 | lily |
| 3 | tom |
+----+-------+
3 rows in set (0.00
sec)
可以看到新的数据,并且只有savapoint之前的数据。

时间: 2024-11-08 18:37:44

mysql事务简单测试的相关文章

基于MySQL元数据的Hive的安装和简单测试

引言: Hive是一种强大的数据仓库查询语言,类似SQL,本文将介绍如何搭建Hive的开发测试环境. 1. 什么是Hive? hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行. 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析. 2.  按照Hive的准备条件 2.1  Hadoop集

测试你对MySQL事务与隔离级别的理解的一道题

之前写过一篇<MySQL InnoDB 四种事务隔离级别 与脏读.可重复读.幻读> http://blog.csdn.net/seven_3306/article/details/27085275 这是我自己琢磨出来的一道关于MySQL事务和隔离级别的题目,请填写问号部分的内容: 如果你能正确的说明出如下结果,那么你应该对MySQL事物和隔离级别有一定的认识了. 如果不是,那么可能你并不理解MySQL的事务和隔离级别. 另外这道题可以帮你理解为什么有的时候会出现这个问题: ERROR 1205

Mysql事务的隔离级别

注:转 SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销.Read Uncommitted(读取未提交内容) 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果.本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少.读取未提交的数据,也被称之为脏读(Dirty Read).Read Committed(读取提交内容) 这是大多数数据库系统的默认隔离级别(但不是MySQL默

MYSQL事务隔离

MySQL主要有4种类型的事务隔离级别,分别为: read uncommitted [读取未提交内容] 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果.本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少.读取未提交的数据,也被称之为脏读(Dirty Read). read committed  [读取提交内容] 这是大多数数据库系统的默认隔离级别(但不是MySQL默认的).它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变.这种隔离级别也支持所谓的不可重复读(No

MySQL事务四个隔离级别

MySQL事务隔离级别详解             MySQL数据结构SQL SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销. Read Uncommitted (读取未提交的内容)  在该隔离级别,所有事务都可以看到其他未提交事务的执行结果.本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少.读取未提交的数据,也被称之为脏读(Dirty Read).Read Commit

MySQL事务提交过程(一)

MySQL作为一种关系型数据库,已被广泛应用到互联网中的诸多项目中.今天我们来讨论下事务的提交过程. MySQL体系结构 由于mysql插件式存储架构,导致开启binlog后,事务提交实质是二阶段提交,通过两阶段提交,来保证存储引擎和二进制日志的一致. 本文仅讨论binlog未打卡状态下的提交流程,后续会讨论打开binlog选项后的提交逻辑. 测试环境 OS:WIN7 ENGINE: bin-log:off DB: 测试条件 set autocommit=0; -- --------------

mysql事务,select for update,及数据的一致性处理

在MySQL的InnoDB中,预设的Tansaction isolation level 为REPEATABLE READ(可重读) 在SELECT 的读取锁定主要分为两种方式: SELECT ... LOCK IN SHARE MODE SELECT ... FOR UPDATE 这两种方式在事务(Transaction) 进行当中SELECT 到同一个数据表时,都必须等待其它事务数据被提交(Commit)后才会执行. 而主要的不同在于LOCK IN SHARE MODE 在有一方事务要Upd

struts2+hibernate+spring注解版框架搭建以及简单测试(方便脑补)

为了之后学习的日子里加深对框架的理解和使用,这里将搭建步奏简单写一下,目的主要是方便以后自己回来脑补: 1:File--->New--->Other--->Maven--->Maven Project--->Next(之后界面如下所示:) --->Next(点击next之后出现如下界面:选择最后一个 maven-archetype-webapp,然后点击next) --->Next(点击next之后出现如下界面,然后选择好组织号,工程号,版本号即可),最后点击Fi

MySQL事务之数据结构

事务是关系型数据库的核心,贯穿整个源代码,先来瞅瞅相关的数据结构,揭开面纱: server层和innodb引擎层分别对应了不同的数据结构,但相互关联: server层需要引擎注册事务,以便server层能够引用. innodb层需要维持事务的状态,以及事务的状态转换的具体实现. 1. 相关数据结构 下面用一个简略图描述server和innodb的事务交互: 简单描述一下: server层通过stmt和all链表关联了所有参与事务的引擎. 每一个connection,在innodb引擎分配一个tr