数据库事务详解

概述

 

数据库的事务是一种机制,一个操作序列,包含了一组数据库命令。事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这组数据库命令要么同时成功,要么同时失败。

例:张三和李四账户中各有1000块钱,现李四需要转换500块钱给张三,具体的转账操作为:

第一步:查询李四账户余额
第二步:从李四账户金额 -500
第三步:给张三账户金额 +500
现在假设在转账过程中第二步完成后出现了异常第三步没有执行,就会造成李四账户金额少了 500 ,而 张三金额并没有多500 ;这样的系统就是有问题的。如果解决呢?使用事务可以解决上述问题。
从上图可以看到在转账前开启事务,如果出现了异常回滚事务,三步正常执行就提交事务,这样就可以完美解决问题。

语法

开启事务:start transaction;或begin;

提交事务:commit;

回滚事务:rollback;

代码验证

环境准备:

-- 创建账户表
CREATE TABLE account(
id int PRIMARY KEY auto_increment,
name varchar ( 10 ),
money double ( 10 , 2 )
);
-- 添加数据
INSERT INTO account(name,money) values ( ' 张三 ' , 1000 ),( ' 李四 ' , 1000 );

不加事务演示问题

-- 转账操作
-- 1. 查询李四账户金额是否大于 500
-- 2. 李四账户 -500
UPDATE account set money = money - 500 where name = ' 李四 ' ;
出现异常了 ... -- 此处不是注释,在整体执行时会出问题,后面的 sql 则不执行
-- 3. 张三账户 +500
UPDATE account set money = money + 500 where name = ' 张三 ' ;
整体执行结果肯定会出问题,我们查询账户表中数据,发现李四账户少了 500。

添加事务sql如下

-- 开启事务
BEGIN ;
-- 转账操作
-- 1. 查询李四账户金额是否大于 500
-- 2. 李四账户 -500
UPDATE account set money = money - 500 where name = ' 李四 ' ;
出现异常了 ... -- 此处不是注释,在整体执行时会出问题,后面的 sql 则不执行
-- 3. 张三账户 +500
UPDATE account set money = money + 500 where name = ' 张三 ' ;
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;
上面 sql中的执行成功进选择执行提交事务,而出现问题则执行回滚事务的语句。

事务的四大特征

原子性( Atomicity : 事务是不可分割的最小操作单位,要么同时成功,要么同时失败
一致性( Consistency : 事务完成时,必须使所有的数据都保持一致状态
隔离性( Isolation : 多个事务之间,操作的可见性
持久性( Durability : 事务一旦提交或回滚,它对数据库中的数据的改变就是永久的
说明:
mysql 中事务是自动提交的。
也就是说我们不添加事务执行 sql 语句,语句执行完毕会自动的提交事务。
可以通过下面语句查询默认提交方式:
SELECT @@autocommit ;
查询到的结果是 1 表示自动提交,结果是 0 表示手动提交。当然也可以通过下面语句修改提交方式
set @@autocommit = 0 ;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值