mysql怎么测试事物_mysql事务简单测试

本文介绍了MySQL中如何进行事务控制,包括如何开始事务、提交回滚事务、使用CHAIN和RELEASE命令以及修改提交方式。通过实例展示了事务的提交和回滚,以及SAVEPOINT的使用,帮助理解MySQL事务的工作原理。
摘要由CSDN通过智能技术生成

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之前的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值