一、什么是事务
直接百科
可以看一下,前面的没有啥用,自己了解,主要看后面的一句话。
事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。
这也就是说,事务,有一个开始,还有一个结束。然后再往下看
这个百科也举了一个例子:在关系型数据库中,一个事务可以是一条 SQL,或者一组 SQL,再或者整个程序。
二、事务的特性
这个背也要背会,这以后写程序这些东西是一定要知道的!!!
事务有四种特性,原子性、一致性、隔离性、持久性。
事务,要么全部成功,要么全部失败。好比说我们在银行转钱,你赚钱转到一半,刚刚从你这里把钱扣掉, 但是服务器宕机了,这你怎么办,对面还没有收到钱。所以说,在这个事务中,转钱收钱,要么一起成功,要么就都不成功。
三、MySQL 对事务的支持。
MySQL 中有数据引擎,我们常见的一般就两种,InnoDB 和 MyISAM,这里注意的是,InnoDB 支持事务,而 MyISAM 不支持事务!!!
以下的这些都是针对 InnoDB 说的。
set autocommit = 0; 关闭自动提交,改为手动提交。
set autocommit = 1; 开启自动提交。
start transaction; 启动事务。
begin; 相当于上面的 start transaction。
commit; 提交事务。
rollback; 回滚事务。
savepoint 保存点名称; 设置事务保存点。
rollback to savepoint 保存点名称; 这个是回滚到某一个保存点上。
set transaction 设置事务的隔离级别。
InnoDB 存储引擎提供事务的隔离级别有:读未提交(READ UNCOMMITTED),读提交 (READ COMMITTED),可重复读 (REPEATABLE READ),串行化 (SERIALIZABLE)。
(这个隔离级别先了解即可,比较复杂~~)
四、银行转账实例
这个说多了都没有啥用,我们写个例子感受一下。
首先我们去创建一个 t_user 表。
CREATE TABLE `t_user` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`price` decimal(10,2) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
然后自己去填写两个数据。
然后我们创建一个项目,然后写一个方法~
很简单哈,一个进行扣钱,一个进行加钱,然后一起提交。
我们写个测试类。
我们运行一下。
当然哈,这个是正常的时候。
如果我们现在让这个程序出现点异常呢?
来修改一下。
这段代码肯定报错,然后我们再来运行。
可以看到,出现异常了, 再来看看数据库。
???这个 陈2 的钱被扣掉了,但是因为程序报错,这个钱就被扣掉了。而且 陈1 这个人的钱也没有多。
我们说过,类似这样的事情,要么就一起成功,要么就一起失败,不能说,一个人的钱扣了,另外一个人的钱没变。
这里我们引入一下事务。
我们先把自动提交关闭了,然后进行操作,把我们要操作的东西捕获起来,最后进行提交,如果出现异常,直接回滚。
最后关闭自动提交,来测试一下。
再来看看数据库
是没有问题的。
五、回退事务点
这个回退事务点其实很简单。我们来看看怎么操作。
首先定义一个事务点,我们使用 conn.setSavepoint(); 进行定义。
然后到回滚的时候,我们回滚到事务点即可。
然后我们来测试一下。
报错后,来看看数据库。
是 OK 的哈。
大家要好好练习一下, 有问题 QQ 私聊我:2100363119