java_day16

时光总嘲笑我的痴心妄想 提交于 2019-12-04 01:54:11

MySQL数据库

事务

由多条SQL语句组成一个功能,这多条SQL语句就组成了一个事务。一个事务中的多条SQL要么都执行,要么都不执行,事务是一个不可分割的工作单位(原子性)。

事务的应用场景说明

例如: 张三给李四转账,张三账号减钱,李四账号加钱  

模拟张三给李四转500元钱,一个转账的业务操作最少要执行下面的2条语句:

  1. 张三账号-500

  2. 李四账号+500

假设当张三账号上-500元,服务器崩溃了。李四的账号并没有+500元,数据就出现问题了。我们需要保证其中一条SQL语句出现问题,整个转账就算失败。只有两条SQL都成功了转账才算成功。这个时候就需要用到事务。

事务的四大特性(ACID)

 

手动提交事务

 

手动提交事务使用步骤

第1种情况:开启事务 -> 执行SQL语句 -> 成功 -> 提交事务

第2种情况:开启事务 -> 执行SQL语句 -> 失败 -> 回滚事务

 

 

 

 案例1:

 

 

 

 

案例2:

 

 

 

自动提交事务

MySQL的每一条DML(增删改)语句都是一个单独的事务,每条语句都会自动开启一个事务,执行完毕自动提交事务,MySQL默认开始自动提交事务。

 

 

 1.将金额重置为1000

 

 

2.执行以下SQL语句

UPDATE account SET balance = balance - 500 WHERE id=1;

3.使用SQLYog查看数据库:发现数据已经改变

 

 使用SQL语句查看MySQL是否开启自动提交事务

 

show variables like '%commit%';
-- 或
SELECT @@autocommit; -- 推荐

通过修改MySQL全局变量"autocommit",取消自动提交事务

0:OFF(关闭自动提交) 1:ON(开启自动提交)

 

4.取消自动提交事务,设置自动提交的参数为OFF

-- 执行SQL语句:
set autocommit = 0;

5.在控制台执行以下SQL语句:张三-500

 

UPDATE account SET balance = balance - 500 WHERE id=1;

 

6.使用SQLYog查看数据库,发现数据并没有改变

 

 

7.在控制台执行commit提交任务

 

 

 8.使用SQLYog查看数据库,发现数据改变

 

 

 

 

 

 

事务原理

事务开启之后, 所有的操作都会临时保存到事务日志, 事务日志只有在得到commit命令才会同步到数据表中,其他任何情况都会清空事务日志(rollback,断开连接

  1. 用户登录MySQL服务器,会创建一个临时的事务日志文件

  2. 当开启事务后,后续的SQL语句会保存到临时的事务日志文件中

  3. 提交事务,将临时日志文件中的所有SQL语句作用到数据上

  4. 回滚事务,删除临时日志文件

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!