测试MySQL事务管理

1.MySQL 版本

mysql> select version();
+------------+
| version()  |
+------------+
| 5.5.37-log |
+------------+
1 row in set (0.00 sec)

2.创建测试表

mysql> create table test_trans(id int ,name_ varchar(10));
Query OK, 0 rows affected (0.29 sec)

mysql> show table status like ‘test_trans%‘;
+------------+--------+---------+------------+------+----------------+-------------+-
| Name       | Engine | Version | Row_format | Rows | Avg_row_length | Data_length |
+------------+--------+---------+------------+------+----------------+-------------+-
| test_trans | InnoDB |      10 | Compact    |    0 |              0 |       16384 |
+------------+--------+---------+------------+------+----------------+-------------+-
1 row in set (0.00 sec)

3.测试事物

MySQL通过SET AUTOCOMMIT, START TRANSACTION, COMMIT和ROLLBACK等语句支持本地
事务。
语法:
START TRANSACTION | BEGIN [WORK]
COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
SET AUTOCOMMIT = {0 | 1}

默认情况下,mysql是autocommit的,如果需要通过明确的commit和rollback来提交和
回滚事务,需要通过明确的事务控制命令来开始事务,这是和oracle的事务管理明显不
同的地方。START TRANSACTION或BEGIN语句可以开始一项新的事务。
COMMIT和ROLLBACK用来提交或者回滚事务。

START TRANSACTION或BEGIN语句可以开始一项新的事务。
COMMIT和ROLLBACK用来提交或者回滚事务。
CHAIN和RELEASE子句分别用来定义在事务提交或者回滚之后的操作,chain会立即启动
一个新事物,并且和刚才的事务具有相同的隔离级别,release则会断开和客户端的连接

mysql> begin
    -> insert into test_trans values(1,‘segment‘),(2,‘tablespace‘);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘insert into test_trans values(1,‘segment‘),(2,‘tablespace‘)‘ at line 2
mysql> insert into test_trans values (1,‘segment‘),(2,‘tablespace‘);
Query OK, 2 rows affected (0.21 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from test_trans;
+------+------------+
| id   | name_      |
+------+------------+
|    1 | segment    |
|    2 | tablespace |
+------+------------+
2 rows in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from test_trans;
+------+------------+
| id   | name_      |
+------+------------+
|    1 | segment    |
|    2 | tablespace |
+------+------------+
2 rows in set (0.00 sec)

a.没有成功,报错了,发现 begin 语句不是这样写的,之后再测试
mysql> truncate table  test_trans;
Query OK, 0 rows affected (0.06 sec)

mysql> begin ;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into test_trans values (1,‘segment‘),(2,‘tablespace‘);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from test_trans;
+------+------------+
| id   | name_      |
+------+------------+
|    1 | segment    |
|    2 | tablespace |
+------+------------+
2 rows in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.08 sec)

mysql> select * from test_trans;
Empty set (0.00 sec)
mysql>

b.测试下 start transaction
mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into test_trans values (1,‘segment‘),(2,‘tablespace‘);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from test_trans;
+------+------------+
| id   | name_      |
+------+------------+
|    1 | segment    |
|    2 | tablespace |
+------+------------+
2 rows in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.07 sec)

mysql> select * from test_trans;
Empty set (0.00 sec)

mysql>
时间: 2024-10-05 19:27:09

测试MySQL事务管理的相关文章

spring测试junit事务管理及spring面向接口注入和实现类单独注入(无实现接口),实现类实现接口而实现类单独注入否则会报错。

1.根据日志分析,spring junit默认是自动回滚,不对数据库做任何的操作. 18:16:57.648 [main] DEBUG o.s.j.d.DataSourceTransactionManager - Switching JDBC Connection [[email protected]] to manual commit 18:16:57.649 [main] DEBUG o.s.t.c.t.TransactionalTestExecutionListener - No meth

spring hibernate 事务整合 使用测试类 事务不自动提交的问题!!!

使用JUnit 测试hibernate 事务管理的时候应注意 ,测试类完成是默认回滚的. 所以只能查询数据库却不能增删改数据库. 应该在测试类上面加上注解 @Rollback(false)  表似默认不回滚. package TestHibernate; import java.util.List; import javax.annotation.Resource; import org.junit.Test; import org.junit.runner.RunWith; import or

MYSQL事务隔离

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

mysql测试spring事务是否生效

同时对三张表进行插入操作,事务保证完整性.下面进行简单测试: 1. 锁定表 锁定用户表 LOCK TABLES user WRITE; 查看表是否锁定: show OPEN TABLES where In_use > 0; 显示被锁定的表. 2. 验证在同一session下是否可以插入操作 insert into user(userId,ip,type,terminal) values(10002,'127.0.0.1',7,'pc'); 可以操作成功. 3. 启动spring应用,执行插入操作

MySQL密码管理、存储引擎及事务

MYSQL密码管理: 修改用户密码: (1) SET PASSWORD [FOR 'user'@'host'] = PASSWORD('cleartext password'); (2) UPDATE mysql.user SET Password=PASSWORD('cleartext password')  WHERE User='USERNAME' AND Host='HOST'; (3) mysqladmin -uUSERNAME -hHOST -p  password 'NEW_PAS

mysql批处理/触发器/事务管理/存储过程

mysql里的批处理(sql语句) 格式: l mysql –u user –p < sql_file 表示从某个文件里执行sql语句 l mysql –u user –p < sql_file > out_file 表示从某个文件里执行,并将执行结果保存到out_file文件之中 举个例子: 小王每天早晨来之后,都需要查询班级共有多少人,还要查本学期共有几门课程,还要查询最近的考试成绩........需要做很多操作 sql.txt里  use pingtai;   //选择数据库 se

Spring事务管理实现原理及MySQL InnoBD引擎行锁概述

Spring实现事务管理的机制 Spring事务管理是基于AOP编程思想实现,Spring框架被广泛使用的原因之一,就是提供了强大的事务管理机制. AOP是什么?我们常说的AOP并不是指一种开发技术,而是一种编程思想,AOP的核心概念就是面向切面编程,实现可插拔,降低程序之前的耦合性,提高重用性. Spring AOP 基于动态代理实现,一种是JDK动态代理,另一种是CGLIB动态代理. spring2.5之前声明式事务可以这样实现: ?<!-- 声明使用的spring事务管理器--> <

Spring+Mybatis+MySql+Maven 简单的事务管理案例

利用Maven来管理项目中的JAR包,同时使用Spring在业务处理层进行事务管理.数据库使用MySq,数据处理层使用Spring和Mybatis结合. 本案例代码主要结构如图: 1.数据库脚本 -- ---------------------------- -- Table structure for `user` -- ---------------------------- DROP TABLE IF EXISTS `user`; CREATE TABLE `user` (   `id` 

MySQL存储过程之事务管理

ACID:Atomic.Consistent.Isolated.Durable 存储程序提供了一个绝佳的机制来定义.封装和管理事务. 1,MySQL的事务支持 MySQL的事务支持不是绑定在MySQL服务器本身,而是与存储引擎相关: Java代码 1         MyISAM:不支持事务,用于只读程序提高性能 2         InnoDB:支持ACID事务.行级锁.并发 3         Berkeley DB:支持事务 隔离级别: 隔离级别决定了一个session中的事务可能对另一个