transaction在数据库编程中是一个重要的概念,这样做可以控制对数据库操作的事务提交。
但是要想在程序中实现事务,要求数据库本身支持事务。
现在的关系型数据库,我们日常使用的mysql,oracle等等都支持事务,有的是安装后直接就支持,有的需要做一些设置。这里我就自己的经历总结了一下如何设置以及设置的步骤:
进入mysql
mysql> select * from tester;
+----+--------+--------------+--------+-------+--------+
| ID | name   | address      | salary | grade | sex    |
+----+--------+--------------+--------+-------+--------+
|  1 | jason  | shenzhen     |   4500 |     6 | male   |
|  2 | linkle | zhuhai       |   4000 |     5 | female |
|  3 | leo    | zhuhai       |   3000 |     4 | male   |
|  5 | steven | zhuhai_jinan |   5600 |     7 | male   |
|  6 | jacky  | zhuhai       |   4000 |     5 | male   |
+----+--------+--------------+--------+-------+--------+
5 rows in set (0.00 sec)
mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into tester values(7,'jack','HongKong',8000,10,'male');
Query OK, 1 row affected (0.00 sec)
mysql> rollback;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> select * from tester;
+----+--------+--------------+--------+-------+--------+
| ID | name   | address      | salary | grade | sex    |
+----+--------+--------------+--------+-------+--------+
|  1 | jason  | shenzhen     |   4500 |     6 | male   |
|  2 | linkle | zhuhai       |   4000 |     5 | female |
|  3 | leo    | zhuhai       |   3000 |     4 | male   |
|  5 | steven | zhuhai_jinan |   5600 |     7 | male   |
|  6 | jacky  | zhuhai       |   4000 |     5 | male   |
|  7 | jack   | HongKong     |   8000 |    10 | male   |
+----+--------+--------------+--------+-------+--------+
6 rows in set (0.00 sec)
按照上面的步骤rollback没有生效,即便我设置了autocommit=0。By the way,如果SET AUTOCOMMIT=0;也就是关闭了自动提交,那么任何commit或rollback语句都可以触发事务提交;如果SET AUTOCOMMIT=1;也就是开启了自动提交(默认值),那么必须要以begin或者START TRANSACTION声明事务的开始,然后再以commit或rollback语句都可以触发事务提交。
接下来就需要进行配置:
1.安装
在mysql下默认的是MyISAM存储引擎,它是一个非事务型的存储引擎,成为了MYSQL的缺省存储引擎。要想在mysql的表中支持transaction,必须要求是innodb表,而不是MyISAM。普通表使用的autocommit模式,会自动提交每一条sql语句,不能算是transaction吧。安装时要指定mysql支持innodb。
如何查看表的状态呢?
>mysql> use tester;
Database changed
mysql> show table status;
+--------+--------+---------+------------+--------+------+----------+------
| Name   | Engine | Version | Row_format | Rows | Avg_row_length | Data_length Max_data_length   | Index_length | Data_free | Auto_increment | Create_time         | Update_time         | Check_time | Collation         | Checksum | Create_options | Comment |
+--------+--------+-------------------+----------+----------------+---------+
| dept   | MyISAM |      10 | Fixed      |    3 |             59 |         177 | 16607023625928703 |         2048 |         0 |           NULL | 2009-06-06 10:23:30 | 2009-06-06 12:18:02 | NULL       | latin1_swedish_ci |     NULL |                |         |
| tem_tb | MyISAM |      10 | Fixed      |    3 |             73 |         219 | 20547673299877887 |         2048 |         0 |           NULL | 2009-06-05 16:18:49 | 2009-06-05 16:47:01 | NULL       | latin1_swedish_ci |     NULL |                |         |
| temp   | MyISAM |      10 | Fixed      |    4 |             68 |         272 | 19140298416324607 |         2048 |         0 |           NULL | 2009-06-05 16:18:49 | 2009-06-05 16:18:49 | NULL       | latin1_swedish_ci |     NULL |                |         |
| tester | MyISAM |      10 | Fixed      |    6 |             73 |         438 | 20547673299877887 |         5120 |         0 |           NULL | 2009-06-06 14:50:47 | 2009-06-06 14:52:12 | NULL       | latin1_swedish_ci |     NULL |                |         |
+--------+--------+---------+------------+------+----------------+---------
没错,可能你已经注意到了这里的Engine是MyISAM,而不是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

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

2.在/etc下面默认没有my.cnf文件,需要copy,如下:

[root@test-server root]# find / -name 'my*.cnf'
/etc/my.cnf
/usr/share/doc/packages/MySQL-server/my-huge.cnf
/usr/share/doc/packages/MySQL-server/my-innodb-heavy-4G.cnf
/usr/share/doc/packages/MySQL-server/my-large.cnf
/usr/share/doc/packages/MySQL-server/my-medium.cnf
/usr/share/doc/packages/MySQL-server/my-small.cnf
/usr/share/mysql/my-large.cnf
/usr/share/mysql/my-huge.cnf
/usr/share/mysql/my-innodb-heavy-4G.cnf
/usr/share/mysql/my-medium.cnf
/usr/share/mysql/my-small.cnf

在/usr/share/mysql目录下有5个my*.cnf文件,打开查看根据自己配置情况选择一个,执行#cp /usr/share/mysql/my-medium.cnf /etc/my.cnf

这时候,就可以进行上面的配置啦!

3.添加表

mysql> create table testerinfo(ID int primary key,  name char(30), address char(30), sex char(10)) type=innodb;

Query OK, 0 rows affected, 1 warning (0.02 sec)     //设置表的engine

这里出现一个warning,我们查看warning内容:

mysql> show warnings;
+---------+------+-----------------------------------------------------------+
| Level   | Code | Message                                                                  |
+---------+------+-----------------------------------------------------------+
| Warning | 1287 | 'TYPE=storage_engine' is deprecated; use 'ENGINE=storage_engine' instead |
+---------+------+-------------------------------------------------------------+
1 row in set (0.00 sec)

意思是应设置engin=innodb,而不是type。没有关系,下面我们修改:

mysql> alter table testerinfo engine='InnoDB';
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0

没有出现警告提示,搞定!

mysql> show table status;
+------------+--------+---------+------------+------+----------+-------------+-----
| Name       | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length   | Index_length | Data_free | Auto_increment | Create_time         | Update_time         | Check_time | Collation         | Checksum | Create_options | Comment              |
+------------+--------+---------+------------+------+----------------+-------------+
| dept       | MyISAM |      10 | Fixed      |    3 |             59 |         177 | 16607023625928703 |         2048 |         0 |           NULL | 2009-06-06 10:23:30 | 2009-06-06 12:18:02 | NULL       | latin1_swedish_ci |     NULL |                |                      |
| tem_tb     | MyISAM |      10 | Fixed      |    3 |             73 |         219 | 20547673299877887 |         2048 |         0 |           NULL | 2009-06-05 16:18:49 | 2009-06-05 16:47:01 | NULL       | latin1_swedish_ci |     NULL |                |                      |
| temp       | MyISAM |      10 | Fixed      |    4 |             68 |         272 | 19140298416324607 |         2048 |         0 |           NULL | 2009-06-05 16:18:49 | 2009-06-05 16:18:49 | NULL       | latin1_swedish_ci |     NULL |                |                      |
| tester     | MyISAM |      10 | Fixed      |    6 |             73 |         438 | 20547673299877887 |         5120 |         0 |           NULL | 2009-06-06 14:50:47 | 2009-06-06 14:52:12 | NULL       | latin1_swedish_ci |     NULL |                |                      |
| testerinfo | InnoDB |      10 | Compact    |    0 |              0 |       16384 |                 0 |            0 |         0 |           NULL | 2009-06-06 15:23:23 | NULL                | NULL       | latin1_swedish_ci |     NULL |                | InnoDB free: 4096 kB |
+------------+--------+---------+------------+------+----------------+-----+
5 rows in set (0.06 sec)

4.试验

mysql> select * from testerinfo;
Empty set (0.00 sec)

mysql> desc testerinfo;
+---------+----------+------+-----+---------+-------+
| Field   | Type     | Null | Key | Default | Extra |
+---------+----------+------+-----+---------+-------+
| ID      | int(11)  | NO   | PRI |         |       |
| name    | char(30) | YES  |     | NULL    |       |
| address | char(30) | YES  |     | NULL    |       |
| sex     | char(10) | YES  |     | NULL    |       |
+---------+----------+------+-----+---------+-------+
4 rows in set (0.01 sec)

mysql> insert into testerinfo values(1,'jason','shenzhen','male');
Query OK, 1 row affected (0.01 sec)

mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into testerinfo values(2,'tina','zhuhai','female');
Query OK, 1 row affected (0.00 sec)

mysql> select * from testerinfo;
+----+-------+----------+--------+
| ID | name  | address  | sex    |
+----+-------+----------+--------+
|  1 | jason | shenzhen | male   |
|  2 | tina  | zhuhai   | female |
+----+-------+----------+--------+
2 rows in set (0.00 sec)

mysql> insert into testerinfo values(5,'john','zhuhai','male');
Query OK, 1 row affected (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.01 sec)

mysql> select * from testerinfo;
+----+-------+----------+------+
| ID | name  | address  | sex  |
+----+-------+----------+------+
|  1 | jason | shenzhen | male |
+----+-------+----------+------+
1 row in set (0.00 sec)

很高兴,设置成功!接下来大家就可以进行事务处理啦!

mysql中transaction的实现相关推荐

  1. mysql isreg_`Innodb` MySQL中如何优雅的删除大表跑路

    最近很想写写MySQL相关的内容,就从这个话题出发吧 有人说删MySQL表谁不会 不就是 drop table TABLENAME 如果在生产环境中,你对一张TB级别的大表,敲下这行命令 那么你的主管 ...

  2. mysql中的意向锁IS,IX

    知识储备: 1.官方文档上说mysql是支持非锁定读的:这个功能是这样实现的,如果事务a 要对行的数据进行更新的话,那么事务a要得到行的x锁,并把这一行  之前的样子记录在undo log里面,这样一 ...

  3. mysql 超时异常_java.sql.SQLException:超出锁定等待超时;尝试在MYSQL中重启事务异常...

    我在MYSQL中使用一个表名"test",它在事务T1期间锁定,在20分钟内完成.当我在这20分钟内通过另一个事务T2更新这个表时.我收到一个例外: - 11:58:38,584 ...

  4. mysql中以下正确的sql是_总结MySQL中SQL语法的使用

    --where子句操作符: where子句操作符 = 等于 <> 不等于(标准语法) != 不等于(非标准语法,可移植性差) < 小于 <= 小于等于 > 大于 > ...

  5. mysql中删除同一行会经常出现死锁?太可怕了

    之前有一个同事问到我,为什么多个线程同时去做删除同一行数据的操作,老是报死锁,在线上已经出现好多次了,我问了他几个问题: 1. 是不是在一个事务中做了好几件事情? 答:不是,只做一个删除操作,自动提交 ...

  6. MySQL中如何关闭事务的自动提交

    关闭MySQL的事务自动提交 在mysql中,默认情况下,事务是自动提交的,也就是说只要执行一条DML语句就开启了事务,并且提交了事务:(也称之为"一行一提交"): Start t ...

  7. mysql 事物的持久性是指_详解MySQL中事务的持久性实现原理

    前言 说到数据库事务,大家脑子里一定很容易蹦出一堆事务的相关知识,如事务的ACID特性,隔离级别,解决的问题(脏读,不可重复读,幻读)等等,但是可能很少有人真正的清楚事务的这些特性又是怎么实现的,为什 ...

  8. mysql中存储引擎是啥_mysql中的存储引擎

    mysql存储引擎概述 什么是存储引擎? MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不同的功能和能力. ...

  9. mysql中整理设置__MySQL整理

    登录 命令:mysql -h [IP 地址/域名] -P [端口] -u [用户名] -p[密码] 端口默认是3306 mysql -hlocalhost -uroot -p 断开 exit; \q; ...

最新文章

  1. empt注意事项 php_PHP编程注意事项
  2. 预编译头超出上限错误 就是include比较多
  3. linux查看发起ddos攻击的ip,在Linux上使用netstat命令查证DDOS攻击的方法
  4. JVM类加载理解(线程上下文类加载器、Tomcat类加载器)
  5. react月份选择控件_看我的案例:用react写一个日历控件!
  6. 专访华为杨海松:立足合作伙伴价值,构建健康HarmonyOS生态
  7. CentOS 8源码安装Zabbix5.0
  8. 戴尔T630安装Ubuntu操作系统及Gaussian 09
  9. 2021 年 五一数学建模比赛 B 题(第四问至第六问)
  10. Word批量替换勾选框
  11. python爬虫脚本 初级入门爬虫英雄联盟所有皮肤_Python爬虫实战,60行代码爬取英雄联盟全英雄全皮肤,找寻曾今那些被删除的绝版皮肤...
  12. 电脑测试软件 免安装,Keyboard Test Utility:电脑必备键盘测试软件,小体积、免安装...
  13. 代理服务器CCProxy基本设置
  14. 美国大学计算机专业排名2014,2014年美国大学计算机专业排名
  15. 循环 计算机英语,计算机英语词汇解释
  16. Hive left semi join ,select 和 where中不能出现右表字段/不会生成笛卡尔积
  17. 《java并发编程实战》第11章-性能与可伸缩性
  18. LayUI时间线优化
  19. android简单星座查询,简单的星座查询
  20. 关于titanic数据集(一)

热门文章

  1. 注释参数opengl的surfaceview使用findViewById返回null问题解决
  2. Windows 2003 Server 设置技巧
  3. mysql布隆过滤器源码_通过实例解析布隆过滤器工作原理及实例
  4. python操作文件open_python:open/文件操作
  5. type=file的未选择任何文件修改_PDF文件怎样输入到CAD图纸中?懂得这个功能可以快速实现...
  6. java虚拟机内存比例,【Java虚拟机】堆内存分配策略总结
  7. android下载后的app自动安装,Android 7.0 下载APK后自动安装
  8. 在云中利用开源软件进行开发以提高创新能力
  9. Linux命令-Sed用法教程
  10. spi协议时序图和四种模式实际应用详解