`
hz_chenwenbiao
  • 浏览: 1007961 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Mysql的transaction实现(转)

阅读更多

transaction在数据库编程中是一个重要的概念,这样做可以控制对数据库操作的事务提交。
但是要想在程序中实现事务,要求数据库本身支持事务。
现在的关系型数据库,我们日常使用的mysql,oracle等等都支持事务,有的是安装后直接就支持,有的需要做一些设置。
这篇文章是针对mysql的,讲述从数据库安装,设置,一直到sql语句,甚至到java程序中,如何实现transaction。
1.安装
要想在mysql的表中支持transaction,必须要求是innodb表。普通表使用的autocommit模式,会自动提交每一条sql语句,不能算是transaction吧。
安装时要指定mysql支持innodb,./configure --with-innodb。

2.配置
安装后,可以对innodb做一些配置,在my.cnf或my.ini中的[mysqld]段。
#存储目录,如果不指定默认为安装的data目录,为空时以innodb_data_file_path指定路径为准
innodb_data_home_dir =
#数据文件名及大小,默认为ibdata1,10m大小。autoextend可以自增,max:2000M文件最大2g,因为有的硬盘有2g文件大小限制。
innodb_data_file_path = ibdata1:2000M;ibdata2:2000M:autoextend:max:2000M
# 设置缓冲池大小
set-variable = innodb_buffer_pool_size=70M
set-variable = innodb_additional_mem_pool_size=10M
#设置日志文件路径,默认在date目录下,名称为ib_logfile...
innodb_log_group_home_dir =
#设置日志文件数目,默认为3
set-variable = innodb_log_files_in_group=3
# 设置日志文件大小
set-variable = innodb_log_file_size=10M
# 设置日志缓冲大小
set-variable = innodb_log_buffer_size=8M
# 任何事务提交前写入日志,方便故障诊断,请设为1。如果丢失最近的几个事务影响不大的话,设置为0(默认值)。
innodb_flush_log_at_trx_commit=1
#设置超时时间
set-variable = innodb_lock_wait_timeout=50

注意:innodb不会自动生成目录,上面所有指定目录要手工生成。默认不用。

完整的配置参数如下表(下表引自http://man.chinaunix.net/database/mysql/inonodb_zh/2.htm#InnoDB_start):

 

innodb_data_home_dir

这是InnoDB表的目录共用设置。如果没有在 my.cnf 进行设置,InnoDB 将使用MySQLdatadir 目录为缺省目录。如果设定一个空字串,可以在 innodb_data_file_path 中设定绝对路径。

innodb_data_file_path

单独指定数据文件的路径与大小。数据文件的完整路径由 innodb_data_home_dir 与这里所设定值的组合。 文件大小以 MB 单位指定。因此在文件大小指定后必有“M” InnoDB 也支持缩写“G” 1G = 1024M。从 3.23.44 开始,在那些支持大文件的操作系统上可以设置数据文件大小大于 4 GB。而在另一些操作系统上数据文件必须小于 2 GB。数据文件大小总和至少要达到 10 MB。在 MySQL-3.23 中这个参数必须在 my.cnf 中明确指定。在 MySQL-4.0.2 以及更新版本中则不需如此,系统会默认在 MySQL datadir 目录下创建一个 16 MB 自扩充(auto-extending)的数据文件 ibdata1你同样可以使用一个 原生磁盘分区(RAW raw disk partitions(raw devices)) 作为数据文件, 如何在 my.cnf 中详细指定它们请查看第 12.1 节。

innodb_mirrored_log_groups

为了保护数据而设置的日志文件组的拷贝数目,默认设置为 1。在 my.cnf 中以数字格式设置。

innodb_log_group_home_dir

InnoDB 日志文件的路径。必须与 innodb_log_arch_dir 设置相同值。 如果没有明确指定将默认在 MySQL datadir 目录下建立两个 5 MB 大小的 ib_logfile... 文件。

innodb_log_files_in_group

日志组中的日志文件数目。InnoDB 以环型方式(circular fashion)写入文件。数值 3 被推荐使用。在 my.cnf 中以数字格式设置。

innodb_log_file_size

日志组中的每个日志文件的大小(单位 MB)。如果 n 是日志组中日志文件的数目,那么理想的数值为 1M 至下面设置的缓冲池(buffer pool)大小的 1/n。较大的值,可以减少刷新缓冲池的次数,从而减少磁盘 I/O。但是大的日志文件意味着在崩溃时需要更长的时间来恢复数据。 日志文件总和必须小于 2 GB3.23.55 4.0.9 以上为小于 4 GB。在 my.cnf 中以数字格式设置。

innodb_log_buffer_size

InnoDB 将日志写入日志磁盘文件前的缓冲大小。理想值为 1M 8M。大的日志缓冲允许事务运行时不需要将日志保存入磁盘而只到事务被提交(commit)。 因此,如果有大的事务处理,设置大的日志缓冲可以减少磁盘I/O。 在 my.cnf 中以数字格式设置。

innodb_flush_log_at_trx_commit

通常设置为 1,意味着在事务提交前日志已被写入磁盘, 事务可以运行更长以及服务崩溃后的修复能力。如果你愿意减弱这个安全,或你运行的是比较小的事务处理,可以将它设置为 0 ,以减少写日志文件的磁盘 I/O。这个选项默认设置为 0

innodb_log_arch_dir

The directory where fully written log files would be archived if we used log archiving. 这里设置的参数必须与 innodb_log_group_home_dir 相同。 从 4.0.6 开始,可以忽略这个参数。

innodb_log_archive

这个值通常设为 0。 既然从备份中恢复(recovery)适合于 MySQL 使用它自己的 log files,因而通常不再需要 archive InnoDB log files。这个选项默认设置为 0

innodb_buffer_pool_size

InnoDB 用来高速缓冲数据和索引内存缓冲大小。 更大的设置可以使访问数据时减少磁盘 I/O。在一个专用的数据库服务器上可以将它设置为物理内存的 80 %。 不要将它设置太大,因为物理内存的使用竞争可能会影响操作系统的页面调用。在 my.cnf 中以数字格式设置。

innodb_additional_mem_pool_size

InnoDB 用来存储数据字典(data dictionary)信息和其它内部数据结构(internal data structures)的存储器组合(memory pool)大小。理想的值为 2M,如果有更多的表你就需要在这里重新分配。如果 InnoDB 用尽这个池中的所有内存,它将从操作系统中分配内存,并将错误信息写入 MySQL 的错误日志中。在 my.cnf 中以数字格式设置。

innodb_file_io_threads

InnoDB 中的文件 I/O 线程。 通常设置为 4,但是在 Windows 下可以设定一个更大的值以提高磁盘 I/O。在 my.cnf 中以数字格式设置。

innodb_lock_wait_timeout

在回滚(rooled back)之前,InnoDB 事务将等待超时的时间(单位 秒)InnoDB 会自动检查自身在锁定表与事务回滚时的事务死锁。如果使用 LOCK TABLES 命令,或在同一个事务中使用其它事务安全型表处理器(transaction safe table handlers than InnoDB),那么可能会发生一个 InnoDB 无法注意到的死锁。在这种情况下超时将用来解决这个问题。这个参数的默认值为 50 秒。在 my.cnf 中以数字格式设置。

innodb_flush_method

这个参数仅仅与 Unix 相关。这个参数默认值为 fdatasync。 另一个设置项为 O_DSYNC。这仅仅影响日志文件的转储,在 Unix 下以 fsync 转储数据。InnoDB 版本从 3.23.40b 开始,在 Unix 下指定 fdatasync 为使用 fsync 方式、指定 O_DSYNC 为使用 O_SYNC 方式。由于这在某些 Unix 环境下还有些问题所以在 'data' versions 并没有被使用。

innodb_force_recovery

警告:此参数只能在你希望从一个被损坏的数据库中转储(dump)数据的紧急情况下使用! 可能设置的值范围为 1 - 6。查看下面的章节 'Forcing recovery' 以了解这个参数的具体含义。参数设置大于 0 的值代表着 InnoDB 防止用户修改数据的安全度。从 3.23.44 开始,这个参数可用。在 my.cnf 中以数字格式设置。

innodb_fast_shutdown

InnoDB 缺少在关闭之前清空插入缓冲。这个操作可能需要几分钟,在极端的情况下可以需要几个小时。如果这个参数据设置为 1 InnoDB 将跳过这个过程而直接关闭。从 3.23.44 4.0.1 开始,此参数可用。从 3.23.50 开始,此参数的默认值为 1

innodb_thread_concurrency

InnoDB 会试图将 InnoDB 服务的使用的操作系统进程小于或等于这里所设定的数值。此参数默认值为 8。如果计算机系统性能较低或 innodb_monitor 显示有很多线程等侍信号,应该将这个值设小一点。如果你的计算机系统有很我的处理器与磁盘系统,则可以将这个值设高一点以充分利用你的系统资源。建议设值为处理器数目+ 磁盘数目。 从 3.23.44 4.0.1 开始,此参数可用。在 my.cnf 中以数字格式设置。

innodb还需要使用二进制日志文件:

log-bin指定二进制文件名称,不指定默认生成。
log-bin-index 可以指定索引文件。
使用 binlog-do-db可以指定记录的数据库。
使用 binlog-ignore-db可以指定不记录的数据库。
注意的是: binlog-do-db 和binlog-ignore-db 一次只指定一个数据库,指定多个数据库需要多个语句。而且,MySQL会将所有的数据库名称改成小写, 在指定数据库时必须全部使用小写名字,否则不会起作用。

3.添加表
CREATE TABLE user (id INT NOT NULL AUTO_INCREMENT,PRIMARY KEY,fname VARCHAR(15),sname VARCHAR(20),sex VARCHAR(6),age VARCHAR(3)) TYPE=INNODB;
记得后面的TYPE=INNODB。

4.sql语句的transaction实现
两种方式:
如果SET AUTOCOMMIT=0;也就是关闭了自动提交,那么任何commit或rallback语句都可以触发事务提交。
比如:
 mysql> SET AUTOCOMMIT=0;
 Query OK, 0 rows affected (0.00 sec)
 
 mysql> INSERT INTO user(fname,sname) VALUES ('Max','Ma');
 Query OK, 1 row affected (0.00 sec)

 mysql> INSERT INTO user(fname,sname) VALUES ('Sky','Sun');
 Query OK, 1 row affected (0.00 sec)
 
 mysql> COMMIT;
 Query OK, 0 rows affected (0.00 sec)
这样事务就算提交了。
如果SET AUTOCOMMIT=1;也就是开启了自动提交(默认值),那么必须要以begin或者START TRANSACTION声明事务的开始,然后再以commit或rallback语句都可以触发事务提交。
比如:
 mysql> SET AUTOCOMMIT=1;
 Query OK, 0 rows affected (0.00 sec)

 mysql> BEGIN;
 Query OK, 0 rows affected (0.00 sec)
 
 mysql> INSERT INTO user(fname,sname) VALUES ('Max','Ma');
 Query OK, 1 row affected (0.00 sec)

 mysql> INSERT INTO user(fname,sname) VALUES ('Sky','Sun');
 Query OK, 1 row affected (0.00 sec)
 
 mysql> COMMIT;
 Query OK, 0 rows affected (0.00 sec)

像其他关系型数据库一样,也可以使用存储过程(procedure)来封装事务。

5.java程序开发中的实现。
涉及到程序开发实现方法就多了。
一.自己写方法把mysql的底层transaction命令封装。我感觉程序开发中应该尽量避免和底层数据库的过多交互,我没有实现它。
有人实现了,下面是他实现的一个例子网址:http://dlog.cn/html/diary/showlog.vm?sid=7&log_id=2516
二.java的jdbc开发包包含了操作transaction的方法,在java.sql.connection接口里。
使用他的好处是可以和多种类型数据库交互。
三.hibernate等ORM框架工具。
hibernate 中也封状了对transaction的操作,在org.hibernate.Session类中,使用beginTransaction()方法开启 transaction;使用getTransaction().commit()提交transaction;使用getTransaction(). rollback()方法回滚transaciton。
四.这是我常用的一种方法,把hibernate的session的方法封装或者实现jdbc的connection的接口。

分享到:
评论

相关推荐

    mysql分布式事务实现 MySQL XA pdf

    本文将深入探讨MySQL中的分布式事务处理机制,特别是MySQL如何通过XA协议来实现跨数据库的一致性。 #### 二、什么是分布式事务处理(DTP) 分布式事务处理(Distributed Transaction Processing, DTP)是一种确保在多...

    C# 连接 mysql 实现显示,查找,删除操作

    在本文中,我们将深入探讨如何使用C#编程语言与MySQL数据库进行交互,实现显示、查找和删除操作。首先,确保你已经安装了MySQL数据库服务器,并且在你的开发环境中配置了适用于.NET的MySQL数据驱动,例如`MySql.Data...

    【ASP.NET编程知识】.net core 基于Hangfire+Mysql持久化实现定时任务配置方法.docx

    "ASP.NET 编程知识:.NET Core 基于 Hangfire+Mysql 持久化实现定时任务配置方法" 摘要:本文将详细介绍如何使用 Hangfire 和 Mysql 实现基于 .NET Core 的定时任务配置方法,包括 Hangfire 的安装配置、Appsetting...

    MySQL_C_API.rar_API_mysql_doc_mysql api_mysql c语言

    5. **预处理语句**:预处理语句通过`mysql_stmt_init()`、`mysql_stmt_prepare()`、`mysql_stmt_bind_param()`、`mysql_stmt_execute()`等函数实现,提高了执行效率,增强了安全性。 6. **事务处理**:`mysql_begin...

    PHP+mysql功能实现BBS基本功能

    - **事务处理**:对于涉及多条数据的操作,可以使用`beginTransaction`、`commit`和`rollback`进行事务管理,确保数据的一致性。 5. **安全性考虑** - **SQL注入**:使用参数化查询(预编译语句)或预处理语句...

    mysql C++ API 实现

    用c++实现的mysql 访问 /* * test.cpp * * Created on: 2011-3-19 * Author: root * table: * create table users ( * id int(3), * name varchar(20), * password varchar(20) * ); * g++ -I/usr/...

    C#实现Mysql数据库操作实例(含源码)

    在本文中,我们将深入探讨如何使用C#语言来实现对MySQL数据库的操作。C#是一种广泛应用于Windows和Web应用程序开发的强大编程语言,而MySQL则是一种高效、开源的关系型数据库管理系统。结合两者,我们可以创建功能...

    数据库课程设计-员工信息管理系统源码(基于Python和MySQL实现)

    数据库课程设计中的“员工信息管理系统”是一个典型的案例,它展示了如何使用编程语言(如Python)与关系型数据库(如MySQL)交互,实现数据的存储、查询、更新和删除功能。这个系统可以有效地帮助管理和维护组织...

    MySql-C-API.rar_mysql api_mysql c++

    7. **事务处理**:MySQL C API 提供 `mysql_begin_transaction()`, `mysql_commit()`, 和 `mysql_rollback()` 进行事务管理。C++ 封装可能通过 `beginTransaction()`, `commitTransaction()`, 和 `...

    mysql使用实例book-MySQL

    MySQL支持ACID(原子性、一致性、隔离性和持久性)特性,你可以通过`START TRANSACTION;`、`COMMIT;`和`ROLLBACK;`来管理事务。 视图是数据库的虚拟表,提供了一种抽象数据的方式。通过`CREATE VIEW view_name AS ...

    java+mysql窗口版 实现酒店管理系统实验报告

    **Java+MySQL实现酒店管理系统实验报告** 在信息技术领域,Java是一种广泛应用的编程语言,而MySQL则是最常用的开源关系型数据库管理系统之一。本实验报告将详细阐述如何使用Java和MySQL技术来构建一个酒店管理系统...

    TCC-Transaction分布式事务DEMO

    在这个名为"TCC-Transaction分布式事务DEMO"的项目中,我们将深入探讨TCC模式以及如何在基于Mysql数据库的环境中实现它。 **TCC模式详解** TCC(Try-Confirm-Cancel)是一种补偿型的分布式事务处理模式,主要由三...

    jsp servlet mysql实现的二手车汽车管理系统项目源码.zip

    本项目是一个基于JSP、Servlet和MySQL实现的二手车汽车管理系统,专为初学者设计,尤其适合于期末项目作业和日常学习。以下将详细介绍这个系统的关键技术和实现原理。 **1. JSP (JavaServer Pages)** JSP是Java的一...

    Hibernate5 + Mysql实现Demo源码

    **Hibernate5 + MySQL实现Demo源码详解** 在Java开发中,ORM(对象关系映射)框架使得数据库操作变得更加便捷,而Hibernate作为其中的佼佼者,深受开发者喜爱。本Demo基于Hibernate5,结合MySQL数据库,提供了完整...

    mysql 8 MGR集群

    MySQL 8 MGR 集群是一种高可用性的数据库解决方案,通过在多个服务器上部署多个 MySQL 实例,实现数据库的高可用性和负载均衡。本文将详细介绍 MySQL 8 MGR 集群的原理、安装、配置和部署。 一、原理 MySQL 8 MGR ...

    mysql5.7最优配置文件模板.docx

    文章首先介绍了 MySQL 5.7 的新特性和性能提升,然后详细讲解了主从配置的实现步骤,包括创建用于主从同步的数据库账号、备份数据库、还原数据库等步骤。 在主从配置中,文章详细解释了 mysqldump 命令的选项和参数...

    MySql.Data.dll8.0类库

    它实现了ADO.NET接口,使得.NET开发者可以像操作其他.NET数据库一样操作MySQL。 2. **C#集成**:在C#项目中,通过引用MySQL.Data.dll,开发者可以直接使用C#语言来编写数据库相关的代码,如创建数据库连接、执行SQL...

    Transaction

    本篇文章将深入探讨“Transaction”这一主题,包括其定义、ACID属性、事务管理以及在Java编程中的实现。 首先,事务是一个逻辑工作单元,它包含了数据库操作序列,这些操作要么全部执行,要么全部不执行。事务的...

    mysql.data.dll v4.0

    4. **事务处理**: 使用MySqlConnection的BeginTransaction方法,开发人员可以在MySQL数据库中开启一个事务,然后通过MySqlCommand执行一系列SQL命令,最后通过Commit或Rollback决定是否提交或回滚事务,确保数据操作...

    MySQL C API mysql c api访问数据库实例

    MySQL 支持事务,可以使用 `START TRANSACTION`、`COMMIT` 和 `ROLLBACK` 语句来确保数据的一致性。在 C API 中,这可以通过 `mysql_query()` 执行相应的 SQL 语句实现。 6. **关闭连接**: 完成所有数据库操作后...

Global site tag (gtag.js) - Google Analytics