- 浏览: 994622 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (394)
- OSGI (14)
- 多线程 (10)
- 数据库 (30)
- J2ME (1)
- JAVA基础知识 (46)
- 引用包 (1)
- 设计模式 (7)
- 工作流 (2)
- Ubuntu (7)
- 搜索引擎 (6)
- QT (2)
- Ubuntu下编程 (1)
- 小程序 (2)
- UML (1)
- Servlet (10)
- spring (16)
- IM (12)
- 文档视频转为flash格式在线播放 (19)
- Maven (8)
- 远程调用 (2)
- PHPRPC (1)
- EXTJS学习 (2)
- Hibernate (16)
- 技术文章 (38)
- flex (5)
- 海量数据处理 (5)
- FTP (8)
- JS (10)
- Struts (1)
- hibernate search (13)
- JQuery (2)
- EMail (3)
- 算法 (4)
- SVN (7)
- JFreeChart (4)
- 面试 (4)
- 正规表达式 (2)
- 数据库性能优化 (10)
- JVM (6)
- Http Session Cookie (7)
- 网络 (12)
- Hadoop (2)
- 性能 (1)
最新评论
-
hy1235366:
能够随便也发一下,你退火算法程序使用的DistanceMatr ...
模拟退火算法总结(含例子)(转) -
梅强强:
感谢分享。。帮大忙了
swftools转换文件时线程堵塞问题的解决方法 -
wenlongsust:
openoffice和文件不在同一个服务器上,用过吗?
[JODConverter]word转pdf心得分享(转) -
2047699523:
如何在java Web项目中开发WebService接口htt ...
利用Java编写简单的WebService实例 -
abingpow:
唉,看起来好像很详细很不错的样子,可惜不是篇面向初学者的文章, ...
Spring与OSGi的整合(二)(转)
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 将使用MySQL的 datadir 目录为缺省目录。如果设定一个空字串,可以在 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 GB,3.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的接口。
发表评论
-
SQL查询前10条记录(SqlServer/mysql/oracle/sybase)[语法分析] (转)
2011-04-22 00:45 5409这篇文章主要是分析下 ... -
SQL Group by Having 学习(转)
2011-04-19 10:33 1489在select 语句中可以使 ... -
使用PreparedStatement防止SQL注入(转)
2011-04-18 14:58 1784一条效率差的sql语句, ... -
JDBC Class.forName作用(转)
2011-04-13 14:53 1194使用JDBC时,我们都会很自然得使用下列语句: ... -
关于数据库内连接外连接左连接右连接(转)
2011-03-26 19:04 1574内连接:把两个表中数据对应的数据查出来 外连接:以某个表为基础 ... -
数据库事务隔离级别与锁(转)
2011-03-26 18:57 1249一,事务的4个基本特征 Atomic(原子性): 事务中包含的 ... -
PreparedStatement效率为什么高/为什么要使用PreparedStatement代替Statement(转)
2011-03-25 09:28 2773在JDBC应用中,如果你 ... -
浅谈数据库索引(转)
2011-03-23 10:10 1183数据库索引是为了增加查询速度而对表字段附加的一 ... -
漫谈数据库索引(转)
2011-03-23 10:00 1023一、引言 对数据库索引的关注从未淡出我的们的讨论,那 ... -
用SQL语句去掉重复的记录(转)
2011-03-23 01:25 6802海量数据(百万以上) ... -
数据库范式(转)
2011-03-23 01:18 1415当前我们使用的主流数 ... -
mysql中limit的用法详解[数据分页常用] (转)
2011-01-08 16:44 1395在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据, ... -
查询优化的必要性(转)
2010-12-19 09:55 1470查询优化的最终目的是为了提高数据库系统的性能 ... -
Oracle导出数据(转)
2010-12-14 15:33 14801.1 exp 使用方法及 ... -
oracle初次使用
2010-12-14 13:06 1084以前都习惯了使用MySQL ... -
Mysql连接字符串大全(转)
2010-08-15 21:25 4829mysql JDBC 驱动常用的有两个,一个是gj ... -
Hibernate 各种数据库的配置(转)
2010-07-22 20:27 16111. MySql连接配置 MySql数据库的hib ... -
左连接、右连接、全连接及区别(转)
2010-05-16 15:23 4288上节我们介绍了表连接,更确切的说是inner joins內连接 ... -
查询重复记录sql (转)
2010-05-16 15:23 1236这是我的一次笔试题,是查询一个表(id,name)中重复的记录 ... -
我的面试题总结之三:海量数据查询优化(精)(转)
2010-05-16 15:21 2404这是我面试的 ...
相关推荐
用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/...
MySQL执行XA MySQL时,MySQL服务器相当于一个用于管理全局事务中的XA事务的资源管理器。与MySQL服务器连接的客户端相当于事务管理器。从5.1版本开始支持
MySQL XA、Java事务API、atomikos等等,都是基于该规范做的实现。
InnoDB 日志 回滚段 & 崩溃恢复实现详解——修改版.pdf 6.日志系统.ppt MySQL数据库运维--第7周.mp4 7.备份恢复-1.ppt MySQL数据库运维--第8周.mp4 8.备份恢复-2.ppt MySQL数据库运维--第9周.mp4 9.常用工具.ppt 10....
本文将首先介绍MySQL事务相关的基础概念,然后介绍事务的ACID特性,并分析其实现原理。MySQL博大精深,文章疏漏之处在所难免,欢迎批评指正。事务(Transaction)是访问和更新数据库的程序执行单元;事务中可能包含...
public static void StartTransaction(Connection con, String[] sqls) throws Exception { if (sqls == null) { return; } Statement sm = null; try { // 事务开始 System.out.println("事务处理...
里面为一个演示spring事务传播机制的小demo。简单实现转账功能,通过添加注解调整传播级别,同时通过日志打印查看sql是否执行,在mysql中的数据是否发生了变化(操作提交还是回滚了)。
transaction_isolation = REPEATABLE-READ # MySQL支持4种事务隔离级别,他们分别是: # READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE. # 如没有指定,MySQL默认采用的是REPEATABLE-READ,...
修改事务提交方式(是否自动提交,mysql默认自动提交) SET AUTOCOMMIT = 1; //自动提交,为0手动提交 不同数据库引擎MVCC模式各不相同,典型有乐观和悲观并发控制。 innodb 说明: InnoDB的MVCC,是通过在每行...
spring-transaction-managerspring事务管理以及mySQL事务隔离级别
6、数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 彻底理解数据库事务 7、悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作 ...
优惠券系统采用JDBC(MySQL)实现。 优惠券系统项目阶段1: Implementation JDBC (MySQL), which allows companies CRUD coupons for their customers. The customers can purchase coupons and use them. The ...
Node.js-mysql-autoRelease node.js mysql transaction Auto Release connection\ 实现Node.js中连接池自动回收连接功能
代码如下:START TRANSACTION | BEGIN [WORK]COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]SET AUTOCOMMIT = {0 | 1} 我这里要说明的mysql事务处理多个SQL语句的...
在MySQL的官方文档中有明确的说明不支持嵌套事务: 代码如下: Transactions cannot be nested. This is a consequence of the implicit commit performed for any current transaction when you issue a START ...
常见的解决方案有:可靠消息最终一致性、最大努力通知型、TCC补偿性,项目示例基于Spring Cloud实现可靠消息最终一致性和TCC补偿性。 模块说明 ms-core:公共模块 ms-discovery-eureka:服务注册与发现 reliable-...
我们可以通过该mysql新建一个自定义函数,这个函数通过项目的业务去决定新建哪些数据,并且下次需要实现时直接使用该函数,可以多次模拟场景. delimiter $$$ create procedure batchInsert() begin declare i int ...
Mysql 支持3中锁结构 表级锁,开销小,加锁快,不会出现死锁,锁定的粒度大,冲突概率高,并发度最低 行级锁,开销小,加锁慢,会出现死锁,锁定粒度小,冲突概率最低,并发度最高 页面锁,开销和加锁处于表锁和行锁之间,会...