【事务】知识点整理

事务

一.事务的基本介绍

        1.概念

                如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。


例子:张三给李四转账500元

  1. 查询张三账户余额是否大于500
  2. 张三账户  金额-500
  3. 李四账户  金额+500

若在第二步出现了异常,则系统不执行下面的第三部,现实生活中则会导致张三账户少了500元,而李四账户却没有收到此500元,即转账出现了问题。

为了不让此类异常发生,因此我们引入【事务管理】 ,如果上述例子被事务管理,则该例子的所有操作要么同时成功,要么同时失败,若在程序进行中出现异常则会产生回滚操作。


           2.操作:

                          (1).开启事务:start transaction

                          (2).回滚:rollback

                          (3).提交:commit

回滚事务会使数据回滚至开启事务的位置

                        (4).mysql数据库中事务默认自动提交

                                事务提交的两种方式

                                        自动提交:

                                                mysql就是自动提交的

                                                一条DML(增删改)语句会自动提交一次事务

                                        手动提交:

                                                需先开启事务,再提交

二.事务的四大特征

        1.原子性

                事务是不可分割的最小操作单位,要么同时成功,要么同时失败。

        2.持久性

                当事务提交或回滚后,数据库会持久化保存数据

        3.隔离性

                多个事物之间相互独立。(实际上会产生相互影响,还需要了解隔离机制)

        4.一致性

                事物操作前后,数据总量不变。

三.事务的隔离级别(了解)

        1.概念

                多个事物之间是隔离的,相互独立的。但是如果对个事务操作同一数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。

        2.存在的问题

                (1).脏读:一个事物,读取到另一个事务中没有提交的数据。

                (2).不可重复读(虚读):在同一个事务中,两次读取到的数据不一样。

                (3).幻读:一个事务操作(DML)数据表中所有记录,另一个事务添加了一条数据,则第一个事物查询不到自己的修改。

        3.隔离级别

                (1).read uncommitted:读未提交

                        产生的问题:脏读,不可重复读,幻读。

                (2).read committed :读已提交 (oracle默认)

                        产生的问题:不可重复读,幻读

                (3).repeatable read:可重复度(mysql默认)

                        产生的问题:幻读

                (4).serializable:串行化

                        可以解决所有的问题

注意:隔离级别从小到大安全性越来越高,但是效率越来越低。

        数据库查询隔离级别

                select @@tx_isolation;

        数据库设置隔离级别

                set global transaction isolation level 级别字符串;

演示

        set global transaction isolation level read uncommitted;设置隔离级别

        start transaction;开启事务

        --转账操作

        upadate account set balance =balance - 500 where id=1;

        upadate account set balance =balance + 500 where id=2;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值