MySQL数据库的事务管理

当前在开发ERP系统,使用到的数据库为Mysql。下面介绍下如何开启事务,以及事务隔离的机制 :

1. 检查当前数据库使用的存储引擎。

show engines;

2. 修改前my.ini中的文件如下:

3. 修改my.ini的文件如下。

3.1 修改了默认的存储引擎

3.2 增加了mysql数据库的事务隔离级别, 如果不添加默认是REPEATABLE-READ.

4. 只需要重启mysql的服务即可。

net stop mysql

net start mysql

5. 再次查询show engines,显示如下

6. 事务隔离机制的说明,以下引用自别人的文章


  • 未提交读(READ UNCOMMITTED)。另一个事务修改了数据,但尚未提交,而本事务中的SELECT会读到这些未被提交的数据(脏读)。
  • 提交读(READ COMMITTED)。本事务读取到的是最新的数据(其他事务提交后的)。问题是,在同一个事务里,前后两次相同的SELECT会读到不同的结果(不重复读)。如两个会话a和b,由于是read committed所以只有当事务提交后才能被别的事务可见,当a执行查询后b执行插入,b执行commit提交事务,这时a再次查询结果确实不一样的,a的两次查询同属于一个事务,即为不可重复读。
  • 可重复读(REPEATABLE READ)。在同一个事务里,SELECT的结果是事务开始时时间点的状态,因此,同样的SELECT操作读到的结果会是一致的。直到提交事务后再查询才可以看到其他事务在本事务执行期间锁进行的更改操作。在MySQL中InnoDB和XtraDB存储引擎通过多版本并发控制(MVCC)解决了幻读的问题。
  • 串行化(SERIALIZABLE)。读操作会隐式获取共享锁,可以保证不同事务间的互斥。
  • SQL 事务隔离级别 

在MySQL中默认事务隔离级别是可重复读(Repeatable read).可通过SQL语句查询:

查看InnoDB系统级别的事务隔离级别:mysql> SELECT @@global.tx_isolation;

在MySQL中默认事务隔离级别是可重复读(Repeatable read).可通过SQL语句查询:

查看InnoDB系统级别的事务隔离级别:

mysql> SELECT @@global.tx_isolation;

结果:

+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| REPEATABLE-READ       |
+-----------------------+
1 row in set (0.00 sec)

查看InnoDB会话级别的事务隔离级别:

mysql> SELECT @@tx_isolation;

结果:
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)

修改事务隔离级别:

mysql> set global transaction isolation level read committed;

Query OK, 0 rows affected (0.00 sec)

mysql> set session transaction isolation level read committed;

Query OK, 0 rows affected (0.00 sec)

InnoDB 的可重复读隔离级别和其他数据库的可重复读是有区别的,不会造成幻象读(phantom read),所谓幻象读,就是同一个事务内,多次select,可以读取到其他session insert并已经commit的数据。下面是一个小的测试,证明InnoDB的可重复读隔离级别不会造成幻象读。测试涉及两个session,分别为 session 1和session 2,隔离级别都是repeateable read,关闭autocommit

mysql> select @@tx_isolation;

+-----------------+
    | @@tx_isolation  |
    +-----------------+
    | REPEATABLE-READ |
    +-----------------+
    1 row in set (0.00 sec)

mysql> set autocommit=off;

Query OK, 0 rows affected (0.00 sec)

session 1 创建表并插入测试数据

mysql> create table test(i int) engine=innodb;

Query OK, 0 rows affected (0.00 sec)

mysql> insert into test values(1);
    Query OK, 1 row affected (0.00 sec)

session 2 查询,没有数据,正常,session1没有提交,不允许脏读
     mysql> select * from test;
     Empty set (0.00 sec)

session 1 提交事务

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

session 2 查询,还是没有数据,没有产生幻象读
                        
    mysql> select * from test;
    Empty set (0.00 sec)
                        
当session2提交事务后才可以看到session1的插入数据;                       
以上试验版本:
                        
    mysql> select version();
    +-------------------------+
    | version()               |
    +-------------------------+
    | 5.0.37-community-nt-log |
    +-------------------------+
    1 row in set (0.00 sec)

时间: 2024-10-26 07:23:39

MySQL数据库的事务管理的相关文章

MySQL数据库的用户管理、数据库备份与恢复

MySQL 是一个真正的多线程.多用户的 SQL 数据库服务,凭借其高性能.高可靠和易于使用的特性,成为服务器领域中最受欢迎的开源数据库系统.在2008年以前,MySQL 项目由 MySQL AB 公司进行开发.发布和支持,之后历经 Sun 公司收购 MySQL AB 公司,Oracle 公司收购 Sun 公司的过程,目前 MySQL 项目由 Oracle 公司负责运营和维护. MySQL 数据库的用户管理 新建用户mysql -u root -p ##登录数据库use mysql; ##进入m

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

MySQL存储过程之事务管理

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

记录一次Spring boot 搭建框架连接Mysql数据库注解事务不回滚的故障

搭建了一个新框架,使用了spring boot 替换以简化原来繁杂的spring配置,使用Spring注解管理事务,持久层使用mybatis. 连接mysql数据库完成项目的过程中发现不支持事务,因为用的新框架自己本身也不是很了解,刚开始一直以为是自己的框架搭建的有问题, 后来发现是mysql数据库引擎的问题 解决方案 MyISAM不支持事物,InnoDB支持事物 先检查你的mysql版本 ,mysql 4.0系列之前是不支持事务的.    SELECT VERSION(); 检查你的数据库支持

MySQL数据库web维护管理软件

TreeSoft数据库管理系统使用JAVA开发,采用稳定通用的springMVC +JDBC架构,实现基于WEB方式对 MySQL,Oracle,PostgreSQL 等数据库进行维护管理操作. 功能包括:数据库的展示,库表的展示,表字段结构的展示, SQL语句的在线编辑批量执行,表结构的在线设计维护,数据的在线编辑维护,查询语句保存,JSON数据格式化,SQL语法帮助,在线数据源选择配置等.系统内置14套UI皮肤,45套代码编辑区UI方案,使用中可以依个人喜好选择配色方案. 软件不但稳定,实用

MySQL数据库登录密码管理

mysql数据库安装完成默认管理员的登录密码为空,因此可以无需输入密码直接登录数据库,这样是不安全的,以下文章简单介绍如何设置管理员登录数据库的密码和如何修改登录密码,以及忘记登录密码如何处理. 一.环境介绍 操作系统:CentOS 6.5 数据库版本:MySQL 5.5.32 主机名称:mysql-singleton 二.数据库密码管理  1.设置数据库初始密码  [[email protected] ~]# mysqladmin -uoldcat password "123456"

MySQL数据库用户授权管理

一.用户授权 1.注意事项: -  MySQL数据库服务器搭建好之后,放在独立的房间里或者是IDC机房,MySQL数据库服务默认只允许数据库管理员root在本地登录,要在其他客户端登录管理数据库则需要授权才可以. -  程序员(网站运行数据)编程使用数据库都是在客户端,需要授权. -  默认只有数据库管理员在数据库服务器本机登录才有授权权限 2.授权库mysql,主要的几个表: - user表:记录用户的信息 host:客户端 user:授权用户名password:授权用户密码  *_priv:

Mysql数据库分布式事务XA详解

XA事务简介 XA 事务的基础是两阶段提交协议.需要有一个事务协调者来保证所有的事务参与者都完成了准备工作(第一阶段).如果协调者收到所有参与者都准备好的消息,就会通知所有的事务都可以提交了(第二阶段).MySQL 在这个XA事务中扮演的是参与者的角色,而不是协调者(事务管理器). mysql 的XA事务分为内部XA和外部XA. 外部XA可以参与到外部的分布式事务中,需要应用层介入作为协调者:内部XA事务用于同一实例下跨多引擎事务,由Binlog作为协调者,比如在一个存储引擎提交时,需要将提交信

Mysql数据库无法使用事务回滚

package jdbc02; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import org.junit.Test; import jdbc02.*; public class TransactionTest { /**  * Tom 给Jerry 汇款500元  *   * 关于事务:  * 1. 如果多个操作,每个操作使用的是自己的单独的连接,则无