MySQL 事务处理

 本篇文章介绍了为什么要使用MYSQL事务处理,事务处理的术语和命令及事务处理示例。

目录

事务处理

事务处理的术语

控制事务处理

准备表

班级表

学生表

开始事务

使用回退

使用提交

使用保留点

保留点

创建保留点

回退保留点

使用保留点示例

总结


事务处理

可以用来维护数据库完整性,它保证成批的MySQL操作要么完全执行,要么完全不执行。

注意:事务需要表引擎支持,并非所有引擎都支持事务,需要事务处理要选用INNODB表引擎。

事务处理的术语

在使用事务和事务处理时,有几个关键词汇反复出现。

下面是事务处理需要知道的几个术语:

事务(transaction):指一组SQL语句;

回退(rollback):指撤销指定SQL语句过程;

提交(commit):指将未存储的SQL语句结果写入数据库表;

保留点(savepoint):指事务处理中设置的临时占位符(placeholder),可以只回退部分SQL。

控制事务处理

管理事务处理的关键在于将SQL语句分解为逻辑块,并明确规定数据何时应该提交,

何时应该回退。

准备表

班级表
CREATE TABLE `class` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `strNum` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

INSERT INTO `test`.`class` (`id`, `name`, `num`) VALUES ('1', '一班', '1');
INSERT INTO `test`.`class` (`id`, `name`, `num`) VALUES ('2', '二班', '1');
INSERT INTO `test`.`class` (`id`, `name`, `num`) VALUES ('3', '三班', '2');
INSERT INTO `test`.`class` (`id`, `name`, `num`) VALUES ('4', '四班', '0');

学生表
CREATE TABLE `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `gender` tinyint(2) DEFAULT '1',
  `classid` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `classid` (`classid`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

INSERT INTO `student` (`id`, `name`, `gender`, `classid`) VALUES ('2', '姓名:燕子李三', '1', '2');
INSERT INTO `student` (`id`, `name`, `gender`, `classid`) VALUES ('3', '王五', '1', '3');
INSERT INTO `student` (`id`, `name`, `gender`, `classid`) VALUES ('4', '白杨', '1', '3');
INSERT INTO `student` (`id`, `name`, `gender`, `classid`) VALUES ('5', '小白杨', '0', '1');

开始事务

MySQL使用下面的语句来标识事务的开始:

START TRANSACTION

使用回退

MYSQL的ROLLBACK命令用来回退(撤销)MYSQL语句,示例如下:

SELECT * FROM `class`;
START TRANSACTION;
DELETE FROM class where id = 4;
SELECT * FROM `class`;
ROLLBACK;
SELECT * FROM `class`;

说明:

从显示 ’class’表中内容开始。首先执行一条SELECT显示此表当前记录条数。然后开始事务处理,删除一条数据查询是否删除掉。这时用一条ROLLBACK语句回退事务开始后的所有操作,最后一条SELECT语句显示该表最终情况。

注意:事务处理只能用来回退INSERT、DROP、UPDATE语句,

不能回退CREATE、DROP语句。

使用提交

一般的MYSQL语句都是直接针对数据库表执行和编写的。这就是所谓隐含提交,即提交操作是自动进行的。但是在事务处理块中,提交不会隐含进行,为了明确的提交,需要使用COMMIT语句,示例如下:

START TRANSACTION;

INSERT INTO `student` (`name`, `gender`, `classid`) VALUES ('祝枝山', '1', '1');

UPDATE `class` SET `num`= num+1 WHERE `id`='1';

COMMIT;

说明:在这个示例中,从系统中给学生表添加一条数据,并且需要更新相应班级表数量。

因为涉及到student和class两个数据库表,所以使用事务处理块来保证不会出现部分数据更新。最后的COMMIT语句仅在不出错的情况下写出更改。如果第一条INSERT起作用,但第二条UPDATE失败,则INSERT不会提交(自动撤销)。

使用保留点

保留点

简单的ROLLBACK和COMMIT语句就可以写入或撤销整个事务处理。但是更复杂的事务处理可能需要部分提交或回退。为了支持回退部分事务处理,必须在事务处理块中合适的位置放置占位符;这样需要回退时,可以回退到某个占位符。这样的占位符称为保留点。

创建保留点

为了创建占位符,可如以下使用SAVEPOINT语句:

SAVEPOINT add1;

回退保留点

每个保留点都需要标识唯一名称,这样在回退时,MYSQL就知道回退到何处。

回退到保留点,语句如下:

ROLLBACK TO add1;

使用保留点示例

比如有一个批量添加的场景,有很多条数据要添加,如果有错误的话全部回滚代价太大,只需要部分回滚即可。示例如下:

START TRANSACTION;

INSERT INTO `student` (`name`, `gender`, `classid`) VALUES ('唐伯虎', '1', '1');

UPDATE `class` SET `num`= num+1 WHERE `id`='1';

SAVEPOINT add1;

ROLLBACK TO add1;

总结

本篇文章介绍了为什么要使用MYSQL事务处理,事务处理的术语和命令及事务处理示例。

关于mysql事务处理 public static void StartTransaction(Connection con, String[] sqls) throws Exception { if (sqls == null) { return; } Statement sm = null; try { // 事务开始 System.out.println("事务处理开始!"); con.setAutoCommit(false); // 设置连接不自动提交,即用该连接进行的操作都不更新到数据库 sm = con.createStatement(); // 创建Statement对象 //依次执行传入的SQL语句 for (int i = 0; i < sqls.length; i++) { sm.execute(sqls[i]);// 执行添加事物的语句 } System.out.println("提交事务处理!"); con.commit(); // 提交给数据库处理 System.out.println("事务处理结束!"); // 事务结束 //捕获执行SQL语句组中的异常 } catch (SQLException e) { try { System.out.println("事务执行失败,进行回滚!\n"); con.rollback(); // 若前面某条语句出现异常时,进行回滚,取消前面执行的所有操作 } catch (SQLException e1) { e1.printStackTrace(); } } finally { sm.close(); } } 通常都是上述的写法, 在mysql 不支持事务的时候 , 中间的 setAutoCommit 的事务操作是不是都不生效. 现在innoDB支持 事务了, 上述的 java 代码是否能实现 以下的 事务隔离的 操作, 在修改的时候处于锁定状态 或者 只可以通过存储过程来实现, 单行的锁定 BEGIN; SELECT book_number FROM book WHERE book_id = 123 FOR UPDATE; --这里for update , 以前用Oracle的时候也是有这个行锁 // ... UPDATE book SET book_number = book_number - 1 WHERE book_id = 123; COMMIT;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JSON_L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值