MySql事务

1、什么是事务?

        一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。这些组成要么都执行要么都不执行。

               将对数据库的一系列操作封装到一个事务中,这些操作要么执行要么不执行。就是把多个要做的操作组合成一个整体,利用事务的特性来保证操作的安全性。如果一个事务做到一半出现任何错误,就会进行回滚操作,来恢复成最初的模样。

2、事务特性ACID

                原子性(atomicity):事务是一个原子操作,由一系列动作组成,事务的原子性确保动作要么全部完成要么完全不起作用

                一致性(consistency):一致性是指事务必须是数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。比如:用户A和用户B两者的钱加起来是1000,那么不管A和B之间如何转账,事务结束后两个用户的钱加起来应该还是1000,这就是事务的一致性

                隔离性(isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其它事务隔离开来,防止数据损坏

                持久性(durability):一旦事务完成,无论发生什么系统错误,它的结果都不会受到影响,通常情况下,事务的结果被写到持久化存储器中。 

3、事务并发会发生的问题 

        1、脏读

            脏读也被称未读未提交,就是末一事务A读取到了事务B未提交的数据

                流程图解释:事务A先查询了张三的年龄,随后事务B修改张三的年龄,事务A有读取了张三的年龄,然后事务A提交事务,事务B回滚,那事务A第二次查出来的数据就是错的,所以是脏读。 

        2、不可重复读 

                 不可重复读:在一个事务内,多次读取同一个数据,却返回了不同的结果。实际上,这是因为在该事务读取数据的期间,有其它事务对这段数据进行了修改,并且已经提交,就会发生不可重复读的事务

                 流程图解析:事务A先查询张三年龄,随后事务B修改张三年龄,然后之间提交了事务,然后事务A又查询了张三的年龄,两次读取的数据不一样,称为不可重复读

          3、幻读 

              幻读:幻读是指事务不独立执行时,插入或者删除另一个事务当前影响的数据而发生的一种类似幻觉的现象

         流程图解释:事务A先查询C表总数,随后事务B删除一条条记录,然后直接提交了,然后事务A又查询C表总数,两次总数不一样,称为幻读

                 4、总结

                                脏读:读取了其它事务位提交的数据

                                不可重复读:两次读取的内容不一致

                                幻读:两次读取的数量不一样

4、如何解决事务并发带来的问题 

                通过设置不同的数据库事务的隔离级别来解决事务并发带来的问题,不同的隔离级别可以解决不同的问题

               read uncommited(读取未提交内容):在该隔离级别 ,所有事务都可以看到其它未提交事务的执行结果。读取未提交的数据,也被称之为脏读。在该隔离级别脏读幻读不可重复读都可能发生

                read commited(读取提交内容):这是多数数据库系统默认的隔离级别(但MySql默认的时repeatable read 可重复读)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。该隔离级别可解决脏读,无法解决不可重复和幻读

                repeatable read(可重读):这是MySql默认的事务隔离级别,同一事务的多个实例在并发读取数据时,会看到同样的数据。不过理论上,这会导致幻读问题的发生。该隔离级别可以解决脏读、不可重复读。

                serializable(可串行化):这是最高的隔离级别,通过强制事务排序,时之不可能相互冲突,从而解决幻读问题。简而言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。可解决脏读、不可重复读、幻读。

               注意:隔离级别越高性能越弱                 

5、MySql查看隔离级别

select @@global.tx_isolation    #查看全局的隔离级别
select @@tx_isolation           #查看当前会话的隔离级别
show   variables like 'tx_isolation'  #查看会话的隔离级别 

6、MySql设置隔离级别

#隔离级别有READ UNCOMMITED(读未提交) READ COMMITTED(读已提交) REPEATABLE RED(可重读) #SERIALIZABLE(可串行话)
#设置全局隔离级别
set global transaction isolation level 隔离级别
#设置会话隔离级别
set session transaction isolation level 隔离级别
#通过配置文件配置隔离级别(打开mysql.ini文件,添加transaction.isolation="隔离级别")
transaction.isolation="隔离级别"

7、spring如何实现事务 

                1、导入jar包

        <!--spring事务依赖-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${spring.version}</version>
        </dependency>

                2、在spring配置文件配置信息

   <!--注入事务切面类 必须为transactionManager-->
    <bean id="transactionManager"     
     class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            
    </bean>

    <!--开启事务注解驱动-->
    <tx:annotation-driven/>

                3、使用事务注解 

    @Transactional
    public Result updateClearCount(List<VerifyBookVo> verifyBookVos){
        for (VerifyBookVo v : verifyBookVos) {
            verifyBookMapper.updateClearCount(v);
            bookMapper.updateBookCount(v.getBookId(),v.getClearCount());
        }
        return new Result(200,"清除成功成功",null);
    }

  • 23
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值