代码配置没有问题,为什么不回滚事务(要理解Mysql数据库引擎)

在发展的前几天遇到的问题,在调试过程中发现配置service本次交易不工作层,更新后数据库抛出异常或成功,交易不会回滚。随后开始了各种检查,视图spring的事务是否配置正确,进入更新方法时是否开启了事务。经过检查之后发现一切都正常,那为什么事务不回滚呢?问题出在了一个非常难会去考虑的地方(数据库里创建的表不支持事务)。

Mysql数据库默认的创建表的引擎是:MYISAM,使用这样的引擎的表效率高。可是不支持事务,所以我们在建表时最好是依据需求手动去指定我们须要的引擎,以下是一个可以支持事务的建表sql,可以參考一下:

CREATE TABLE   test (
	id varchar(32)  PRIMARY KEY,
	name varchar(32),
	create_time datetime,
	create_user varchar(32) ,
	address varchar(20) NOT NULL ,
	remark varchar(100)
) ENGINE = InnoDB DEFAULT CHARSET=utf8

备注:ENGINE = InnoDB这个配置就是选择何种引擎,InnoDB这样的引擎支持事务。

以下是Mysql数据库常见的几种引擎的说明。能够了解一下,下次再创建表我们就能够选择合适引擎了。

ISAM:索引顺序訪问法(Index Sequential Access Mode)

ISAM是一个定义明白且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数。因此,ISAM运行读取操作的速度非常快,并且不占用大量的内存和存储资源。

ISAM的两个主要不足之处在于,它不支持事务处理。也不可以容错。假设你的硬盘崩溃了,那么数据文件就无法恢复了。假设你正在把ISAM用在关键任务应用程序里,那就必须常常备份你全部的实时数据,通过其复制特性,MYSQL可以支持这种备份应用程序。

MyISAM:Mysql的默认存储引擎

MyISAM是MySQL的ISAM扩展格式和缺省的数据库引擎。除了提供ISAM里所没有的索引和字段管理的大量功能,MyISAM还使用一种表格锁定的机制。来优化多个并发的读写操作,其代价是你须要常常执行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间。MyISAM另一些实用的扩展,比如用来修复数据库文件的MyISAMCHK工具和用来恢复浪费空间的 MyISAMPACK工具。MYISAM强调了高速读取操作,这可能就是为什么MySQL受到了WEB开发如此青睐的主要原因:在WEB开发中你所进行的大量数据操作都是读取操作。所以,大多数虚拟主机提供商和INTERNET平台提供商仅仅同意使用MYISAM格式。MyISAM格式的一个重要缺陷就是不能在表损坏后恢复数据。

HEAP:

HEAP同意仅仅驻留在内存里的暂时表格。驻留在内存里让HEAP要比ISAM和MYISAM都快,可是它所管理的数据是不稳定的。并且假设在关机之前没有进行保存。那么全部的数据都会丢失。在数据行被删除的时候,HEAP也不会浪费大量的空间。

HEAP表格在你须要使用SELECT表达式来选择和操控数据的时候很实用。

要记住,在用完表格之后就删除表格。

InnoDB:

InnoDB数据库引擎都是造就MySQL灵活性的技术的直接产品。这项技术就是MYSQL++ API。在使用MYSQL的时候,你所面对的每个挑战差点儿都源于ISAM和MyISAM数据库引擎不支持事务处理(transaction process)也不支持外来键。虽然要比ISAM和 MyISAM引擎慢非常多,可是InnoDB包含了对事务处理和外来键的支持。这两点都是前两个引擎所没有的。假设你的设计须要这些特性中的一者或者两者,那你就要被迫使用INNODB和BERKLEY引擎中的一个了,我们经常使用的是InnoDB。

InnoDB给MySQL提供了具有提交、回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。

InnoDB锁定在行级而且也在SELECT语句提供一个Oracle风格一致的非锁定读,这些特色添加了多用户部署和性能。没有在InnoDB中扩大锁定的须要。由于在InnoDB中行级锁定适合很小的空间。

InnoDB也支持FOREIGN KEY强制。在SQL查询中。你能够自由地将InnoDB类型的表与其他MySQL的表的类型混合起来,甚至在同一个查询中也能够混合。这是mysql官方的描写叙述。

据推测,许多人想了解更多去网上查一下...

版权声明:本文博客原创文章。博客,未经同意,不得转载。

时间: 2024-10-07 16:09:29

代码配置没有问题,为什么不回滚事务(要理解Mysql数据库引擎)的相关文章

代码配置都没问题,为什么事务不回滚(了解Mysql数据库引擎)

前几天开发中遇到了一个问题,在进行调试的过程中发现配置在service层的事务不起作用,抛出异常后数据库的更新还是成功了,事务并没有回滚,然后就开始各种检查,查看spring的事务是否配置正确,进入更新方法时是否开启了事务,经过检查之后发现一切都正常,那为什么事务不回滚呢?问题出在了一个很难会去考虑的地方(数据库里创建的表不支持事务). Mysql数据库默认的创建表的引擎是:MYISAM,使用这种引擎的表效率高,但是不支持事务,所以我们在建表时最好是根据需求手动去指定我们需要的引擎,下面是一个能

关于mysql数据库引擎MyIsam的表锁理解

MySQL中的锁概念 MySQL中不同的存储引擎支持不同的锁机制.比如MyISAM和MEMORY存储引擎采用的表级锁,BDB采用的是页面锁,也支持表级锁,InnoDB存储引擎既支持行级锁,也支持表级锁,默认情况下采用行级锁. Mysql3中锁特性如下: 表级锁:开销小,加锁块:不会出现死锁,锁定粒度大,发生锁冲突的概率最高,并发度最低. 行级锁:开销大,加锁慢:会出现死锁:锁定粒度最小,发生锁冲突的概率最低,并发性也最高. 页面锁:开销和加锁界于表锁和行锁之间,会出现死锁:锁定粒度界与表锁和行锁

理解MySQL数据库覆盖索引 (转)

http://www.cnblogs.com/zl0372/articles/mysql_32.html 话说有这么一个表: CREATE TABLE `user_group` ( `id` int(11) NOT NULL auto_increment, `uid` int(11) NOT NULL, `group_id` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `uid` (`uid`), KEY `group_id` (`group_id`),

理解MySQL数据库覆盖索引

话说有这么一个表: CREATE TABLE `user_group` ( `id` int(11) NOT NULL auto_increment, `uid` int(11) NOT NULL, `group_id` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `uid` (`uid`), KEY `group_id` (`group_id`), ) ENGINE=InnoDB AUTO_INCREMENT=750366 DEFAULT CHARSET

使用独立的log4net.config文件配置log4net,将日志记录到Mysql数据库【原创】

开发环境: VS2013, Asp.Net MVC 4.0, .Net Framework 4.0, Log4net 1.2.13.0, Mysql.Data.dll,6.8.3.0 设置步骤: 1.在站点根目录下,创建一个log4net.config的XML文件.(文件名称可以任意,我们这里叫做log4net.config) <?xml version="1.0" encoding="utf-8"?><configuration> <

MySQL数据库主从同步配置

Mysql主从安装配置 环境: 主从服务器上的MySQL数据库版本同为5.1.34 主机IP:192.168.0.1 从机IP:192.168.0.2 一. MySQL主服务器配置 1.编辑配置文件/etc/my.cnf # 确保有如下行 server-id = 1 log-bin=mysql-bin binlog-do-db=mysql  #需要备份的数据库名,如果备份多个数据库,重复设置这个选项即可 binlog-ignore-db=mysql  #不需要备份的数据库名,如果备份多个数据库,

【python-Django开发】Django 配置MySQL数据库讲解!!!

官方文档请阅读:https://docs.djangoproject.com/en/1.11/ref/databases/#mysql-db-api-drivers 配置MySQL数据库 1. 新建MySQL数据库 1.新建MySQL数据库: xxx_project $ create database xxx_project charset=utf8; 2.新建MySQL用户 $ create user username identified by '123456'; 3.授权itcast用户访

Django 配置MySQL数据库

DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 数据库引擎 'NAME': 'mydata', # 你要存储数据的库名,事先要创建之 'USER': 'root', # 数据库用户名 'PASSWORD': '0000', # 密码 'HOST': 'localhost', # 主机 'PORT': '3306', # 数据库使用的端口 } } 添加代码 import pymysql pymysql.insta

21_django配置使用mysql数据库的两种方式

目录 配置django项目使用mysql数据库的两种方式 1. 直接在settings.py 文件中添加数据库配置信息 2. 将数据库配置信息存到一个文件中,在settings.py文件中将其引入.(推荐) 安装mysql驱动 1. 使用mysqlclient *推荐 2. 使用pymysql django2.2以上版本默认不支持使用了 配置django项目使用mysql数据库的两种方式 1. 直接在settings.py 文件中添加数据库配置信息 # 配置数据库的第一种方式 DATABASES