数据库4——事务相关

什么事务

  • 事务是一种机制、一个操作序列,包含一组数据库操作命令。
  • 事务中,把所有命令作为一个整体,一起向系统提交执行,要么全部成功,要么全部失败。
  • 事务是一个不可分割的工作逻辑单元。

什么时候会使用到事务

举例:

  • 银行转账
    A客户找B客户借100元,此时B转100块到A的账户,B账户的余额会减少100元,A客户的余额会增加100元。这至少需要两条SQL语句:
    给B的账户减去100元;
    update 账户表 set money=money-100 where name=‘B’;
    给A的账户加上100元。
    update 账户表 set money=money+100 where name=‘A’;
    如果在第一条SQL语句执行成功后,在执行第二条SQL语句之前,程序被中断了(可能是抛出了某个异常,也可能是其他什么原因),那么A的账户没有加上100元,而AB减去了100元,在现实生活中这肯定是不允许出现的。

如果在转账过程中加入事务,则整个转账过程中执行的所有SQL语句会在一个事务中,而事务中的所有操作,要么全都成功,要么全都失败,不可能存在成功一半的情况。

也就是说给A的账户减去100元如果成功了,那么给B的账户加上100元的操作也必须是成功的;否则,给A减去100元以及给B加上100元都是失败的。

事务要如何操作

  • 开启事务:start transaction 或 begin
  • 提交事务:commit
  • 回滚事务:rollback
    上述案列代码
create table account(id int primary key auto_increment,name varchar(20),money double) charset=utf8;
insert into account values(null,"A",1000),(null,"B",1000);
start transaction;//开启事务
update account set money=money+100 where name="A";
update account set money=money-100 where name="B";
commit;//提交事务
rollback//回滚事务

事务的四大特性(ACID)

原子性(Atomicity)

一致性(Consistency)

隔离性(Isolation)

持久性(Durability)

查询事务默认的提交方式:

select @@autocommit;

结果有两种:1—自动提交;0—手动提交。

修改事务提交方式:

set @@autocommit=0/1;

事务的隔离级别

查看隔离级别

select @@tx_isolation;

设置隔离级别

set session transaction isolation level 级别;

读未提交(Read uncommitted)

  • 两个事务同时执行,一个事务会读取到另一个事务中未提交的部分。
  • 安全性最差,可能发生并发数据问题,性能好。

读已提交(Read committed)

  • 两个事务同时执行,一个事务可以读取到另一个事务已提交的数据,不可重复读(在一个事务中两次读取的数据可能不一致。)。
  • Oracle默认的隔离级别。

可重复读(Repeatable Read)

  • 两个事务同时执行,一个事务内部多次执行sql语句不会读取另一个事务已提交的数据,会出现幻读。
  • Mysql默认的隔离级别

串行化(Serializable)

  • 多个事务同时执行,执行过程中,当一个事务执行时,其他事务都排队等候。
  • 安全性好,但性能低下。

事务的并发问题

  • 脏读:读取到其他事务未提交的数据。
  • 不可重复读:一个事务重复读取两次,但两次得到的结果不同,说明读取操作结果是不可重复的。
  • 幻读:一个事务中修改数据,前后读取到的数据信息不一致,说明事务已插入了其他数据。

有些绕,需要多测试看结果!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值