美文网首页
事务的骚操作

事务的骚操作

作者: 阿Q说代码 | 来源:发表于2020-10-27 22:19 被阅读0次

    ​不知道大家对事务了解多少?如果大家使用过数据库,使用过sql进行过查询语句的编写,那么对事务应该也有所耳闻吧,接下来就给大家讲解一下事务的相关内容(如果大家对数据库的相关概念还不是很熟悉的话,可以在后台留言,抽空阿Q会将其进行整理,一并分享给大家)。

    首先是事务的概念:一件事情由n个组成单元,这n个组成单元要么同时成功,要么同时失败,这就是将n个组成单元放到一个事务中了。举个简单的例子:在不考虑试题正确与否的前提下,一张试卷由多个题目构成,当你答完题交给老师的时候是将一整张试卷交给老师,而不是将每道题单独交给老师,在这里试卷就可以理解成一个事务。

    事务的操作一般分为开启事务、事务提交和事务回滚。让我们看一下平时见到的事务都有哪些。

    mysql中的事务
    1)显示的开启一个事务:start transaction
    2)事务提交:commit代表从开启事务事务提交中间的所有的sql都认为有效,真正的更新数据
    3)事务的回滚:rollback 从开启事务事务回滚中间的所有的sql操作都认为无效数据,没有被更新

    JDBC事务操作
    开启事务:conn.setAutoCommit(false);
    提交事务:conn.commit();
    回滚事务:conn.rollback();
    注意:执行sql的connection与开启事务的connnection必须是同一个才能对事务进行控制

    DBUtils事务操作
    无参构造可以开启事务:QueryRunner runner = new QueryRunner();
    无参的构造没有将数据源(连接池)作为参数传入QueryRunner,那么我们在使用QueryRunner对象操作数据库时要使用有Connection参数的方法runner.update(conn,sql);

    接下来就介绍一下事务的特性(ACID),这四个特性一般在面试题中会被问到,需要记忆一下:

    1)原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作,要么都发生,要么都不发生;

    eg:拿购物来说吧,假设你在购物车里添加了两件衣服:鞋子+裤子,当你把两件衣服作为一个订单提交支付的时候,要么两件衣服一起支付成功,要么都失败,不可能存在衣服付完钱了,鞋子还没付完的情况,反之亦然。

    2)一致性(Consistency)一个事务中,事务前后数据的完整性必须保持一致;

    eg:拿转账来说,假设用户A和用户B两者的钱加起来一共是20000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是20000,这就是事务的一致性。

    3)隔离性(Isolation)多个事务,事务的隔离性是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离;

    eg:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。

    4)持久性(Durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

    eg: 例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。

    在许多事务处理同一个数据时,如果没有采取有效的隔离机制,那么并发处理数据时,会带来一些的问题。

    隔离性引发并发问题
    1)脏读:B事务读取到了A事务尚未提交的数据;
    2)不可重复读:一个事务中两次读取的数据的内容不一致;
    3)幻读/虚读:一个事务中两次读取的数据的数量不一致;

    事务的隔离级别
    1)read uncommitted : 读取尚未提交的数据 :哪个问题都不能解决
    2)read committed:读取已经提交的数据 :可以解决脏读 ---- oracle默认的
    3)repeatable read:重读读取:可以解决脏读和不可重复读 ---mysql默认的
    4)serializable:串行化:可以解决脏读、不可重复读和虚读---相当于锁表(如有疑问想提前了解锁表机制,可以提问哟)

    查看mysql数据库默认的隔离级别:select @@tx_isolation
    设置mysql的隔离级别

    例子:设置事务隔离级别+读未提交
    set session transaction isolation level read uncommitted;

    好了以上就是今天的内容了,想了解更多学习知识,请关注微信公众号“阿Q说”,获取更多学习资料吧!你也可以后台留言说出你的疑惑,阿Q将会在后期的文章中为你解答。每天学习一点点,每天进步一点点。

    相关文章

      网友评论

          本文标题:事务的骚操作

          本文链接:https://www.haomeiwen.com/subject/evsfvktx.html