代码配置没有问题,为什么不回滚事务(要理解Mysql数据库引擎)
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官方的描写叙述。
据推测,许多人想了解更多去网上查一下...
版权声明:本文博客原创文章。博客,未经同意,不得转载。
代码配置没有问题,为什么不回滚事务(要理解Mysql数据库引擎)
标签:
小编还为您整理了以下内容,可能对您也有帮助:
代码配置都没问题,为什么事务不回滚(了解Mysql数据库引擎)
前几天开发中遇到了一个问题,在进行调试的过程中发现配置在service层的事务不起作用,抛出异常后数据库的更新还是成功了,事务并没有回滚,然后就开始各种检查,查看spring的事务是否配置正确,进入更新方法时是否开启了事务,经过检查之后发现一切都正常,前几天开发中遇到了一个问题,在进行调试的过程中发现配置在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官方的描述。
如果还想了解更多那就多去网上查查吧...
MySql事务无法回滚的原因有哪些
使用MySQL时,如果发现事务无法回滚,但Hibernate、Spring、JDBC等配置又没有明显问题时,不要苦恼,先看看MySQL创建的表有没有问题,即表的类型。 InnoDB和MyISAM是在使用MySQL最常用的两个表类型,各有优缺点,视具体应用而定。基本的差别为:MyISAM类型不使用MySQL时,如果发现事务无法回滚,但Hibernate、Spring、JDBC等配置又没有明显问题时,不要苦恼,先看看MySQL创建的表有没有问题,即表的类型。
InnoDB和MyISAM是在使用MySQL最常用的两个表类型,各有优缺点,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。
MyIASM是IASM表的新版本,有如下扩展:
二进制层次的可移植性。
NULL列索引。
对变长行比ISAM表有更少的碎片。
支持大文件。
更好的索引压缩。
更好的键吗统计分布。
更好和更快的auto_increment处理。
以下是一些细节和具体实现的差别:
1. InnoDB不支持FULLTEXT类型的索引。
2. InnoDB中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含where条件时,两种表的操作是一样的。
3. 对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
4. DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
5. LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。
另外,InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”
任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势。
在MySQL 5.0里面,MyISAM和InnoDB存储引擎性能差别并不是很大,针对InnoDB来说,影响性能的主要是 innodb_flush_log_at_trx_commit 这个选项,如果设置为1的话,那么每次插入数据的时候都会自动提交,导致性能急剧下降,应该是跟刷新日志有关系,设置为0效率能够看到明显提升,当然,同样你可以SQL中提交“SET AUTOCOMMIT = 0”来设置达到好的性能。另外,还听说通过设置innodb_buffer_pool_size能够提升InnoDB的性能,但是我测试发现没有特别明显的提升。
基本上我们可以考虑使用InnoDB来替代我们的MyISAM引擎了,因为InnoDB自身很多良好的特点,比如事务支持、存储过程、视图、行级锁定等等,在并发很多的情况下,相信InnoDB的表现肯定要比MyISAM强很多,当然,相应的在my.cnf中的配置也是比较关键的,良好的配置,能够有效的加速你的应用。
c# 里 mysql 的事务无法回滚,我代码有错么?
通常在安装过程中不产生,但当第一次启动软件创建数据库(因为用户可能需要配置的连接串)。如何判断是第一次启动,一般最常见的方式是根据配置文件中。
php关于mysql数据库简单回滚问题
我们经常会遇到操作一张大表,发现操作时间过长或影响在线业务了,想要回退大表操作的场景。在我们停止大表操作之后,等待回滚是一个很漫长的过程,尽管你可能对知道一些缩短时间的方法,处于对生产环境数据完整性的敬畏,也会选择不做介入。最终选择不作为的原因大多源于对操作影响的不确定性。实践出真知,下面针对两种主要提升事务回滚速度的方式进行验证,一种是提升操作可用内存空间,一种是通过停实例,禁用 redo 回滚方式进行进行验证。
仔细阅读过官方手册的同学,一定留意到了对于提升大事务回滚效率,官方提供了两种方法:一是增加 innodb_buffer_pool_size 参数大小,二是合理利用 innodb_force_recovery=3 参数,跳过事务回滚过程。第一种方式比较温和,innodb_buffer_pool_size 参数是可以动态调整的,可行性也较高。第二种方式相较之下较暴力,但效果较好。
两种方式各有自己的优点,第一种方式对线上业务系统影响较小,不会中断在线业务。第二种方式效果更显著,会短暂影响业务连续,回滚所有没有提交的事务。
php关于mysql数据库简单回滚问题
我们经常会遇到操作一张大表,发现操作时间过长或影响在线业务了,想要回退大表操作的场景。在我们停止大表操作之后,等待回滚是一个很漫长的过程,尽管你可能对知道一些缩短时间的方法,处于对生产环境数据完整性的敬畏,也会选择不做介入。最终选择不作为的原因大多源于对操作影响的不确定性。实践出真知,下面针对两种主要提升事务回滚速度的方式进行验证,一种是提升操作可用内存空间,一种是通过停实例,禁用 redo 回滚方式进行进行验证。
仔细阅读过官方手册的同学,一定留意到了对于提升大事务回滚效率,官方提供了两种方法:一是增加 innodb_buffer_pool_size 参数大小,二是合理利用 innodb_force_recovery=3 参数,跳过事务回滚过程。第一种方式比较温和,innodb_buffer_pool_size 参数是可以动态调整的,可行性也较高。第二种方式相较之下较暴力,但效果较好。
两种方式各有自己的优点,第一种方式对线上业务系统影响较小,不会中断在线业务。第二种方式效果更显著,会短暂影响业务连续,回滚所有没有提交的事务。
thinkphp rollback没有回滚数据库为什么
回滚示例如下:
$m=D('YourModel');//或者是M();
$m2=D('YouModel2');
$m->startTrans();//在第一个模型里启用就可以了,或者第二个也行
$result=$m->where('删除条件')->delete();
$result2=m2->where('删除条件')->delete();
if($result && $result2){
$m->commit();//成功则提交
}else{
$m->rollback();//不成功,则回滚!
}
注意:MySQL数据库必须是Innodb和Bdb才能支持事务。
关于mysql数据库存储引擎描述
关于mysql数据库存储引擎描述
MySQL数据库有多种存储引擎,每种存储引擎都有其特定的特点和用途。以下是一些关于MySQL数据库存储引擎的描述:
1. InnoDB存储引擎:InnoDB是MySQL的默认存储引擎,它提供了事务支持、行级锁定和外键约束等功能。InnoDB适合于需要事务支持和复杂查询的应用程序。
2. MyISAM存储引擎:MyISAM是MySQL早期版本中常用的存储引擎,它不支持事务支持,但提供了全文搜索、表锁和全文索引等功能。MyISAM适合于不需要事务支持的应用程序。
3. Memory存储引擎:Memory存储引擎将数据存储在内存中,可以快速检索数据。Memory适合于需要快速检索数据的应用程序,但需要注意内存溢出的问题。
4. Archive存储引擎:Archive存储引擎适合于需要大量数据的备份和归档,它提供了高压缩比和低读写性能。
5. NDB Cluster存储引擎:NDB Cluster是一个分布式存储引擎,它提供了高可用性和高并发性能。NDB Cluster适合于需要高可用性和高并发性能的应用程序。
总之,MySQL数据库的存储引擎可以根据应用程序的需求进行选择,不同的存储引擎具有不同的特点和用途。