面试经常遇到的事务安全问题

194 阅读3分钟

  众所周知,北京集结了一大批大型甚至顶尖互联网公司,而在上海却是集结了为数众多的外包公司,也因为金融中心的原因,所以涉及银行保险等行业也是非常多,所以到了上海,如果你没有特定的面试企业,那么就会经常遇到金融保险公司,而这些公司则对安全非常重视,不重视都不行。因这种氛围导致整个上海的软件开发都分外重视安全。我得同学面试遇到了很多这样的情况,特总结一下,供大家参考。后面的简答题也很重要,但是篇幅有限制,只能列出题目供大家参考。

  而事物就是其一。

  

图片描述


  --用实例来说明:

  --创建银行账户表

  CREATE TABLE bankaccount(

  acid NUMBER,

  balance NUMBER

  )

  --添加约束

  --余额必须大于1

  ALTER TABLE bankaccount

  ADD CONSTRAINT ck_balance CHECK(balance=1);

  DECLARE

  BEGIN

  UPDATE bankaccount SET balance=balance-2000

  WHERE acid=1001;

  UPDATE bankaccount SET balance=balance+2000

  WHERE acid=1002;

  --两个都正常才提交

  COMMIT;

  --任何一个出现异常则都不执行

  EXCEPTION

  WHEN others THEN

  ROLLBACK;

  dbms_output.put_line('交易失败,回滚中');--提示

  END;

  --详细解释一下

  SELECT * FROM bankaccount

  --小强 1001 2000

  --小明 1002 4001

  --不使用事务

  --由小强向小明转账 2000

  UPDATE bankaccount SET balance=balance-2000

  WHERE acid=1001;

  UPDATE bankaccount SET balance=balance+2000

  WHERE acid=1002;

  SELECT * FROM bankaccount;

  --结果:

  --小强 1001 2000

  --小明 1002 6001

  --恐怕小明会高兴死,然后接到银行起诉犯罪的短信或者律师函。

  --不过相反如果你损失钱了,银行得到这笔钱了,那么你就会哭死,

  --你还不能找回来,当然也不能起诉银行

  --由此你可以明白事物的重要了吧

  --

  --原子性:

  --要么同时转账,connit提交;

  --要么同时不转账 rollback ;

  --以前最小的执行单元是一个sql语句。

  --而原子性之下就是捆绑了两个或者以上各sql语句

  --只能同时成功或者同时失败。

  --实为最小的逻辑单元。无法再分的整体,

  --甚至你都不知道里面有几个sql语句

  --一致性:

  --只是修改了表数据,有没有动表结构

  --所以前后表约束不会发生变化,账户余额必须大于1不会变,这是其一。

  --其二,数据在逻辑单元上前后一致。

  --貌似能量守恒定律,钱(能量)只是进行了转移,前面是6001,后面还是6001;

  --而没有减少或者增加,当然被银行扣除的手续费,你懂得。

  --隔离性:

  --比如今天我有一百笔金额进账,想想就幸福。

  --若是凑巧,同一时间,那么就是连个事物同时进行,

  --当然不能让着两笔进账失败了啊,这可都是小钱钱。

  --所以这两个事物互不干扰,互不影响。

  --建设有一个漏洞,支付一万块钱与进账一块钱两个事物同时进行。

  --若是因为相互影响,导致同时失败,能同时抵消,那么想想就幸福。

  --持久性:

  --这是相对于数据来讲的。也就是提交成功,则数据永久有效。

  --如果回滚则数据完全没有被修改。

  --现在貌似很多转账诈骗

  --如果转出去的钱能回滚,无视持久性,那该多好。

  --附录一些事务面试题

  选择题:如果有两个事务,同时对数据库中同一数据进行操作,不会引起冲突的操作是()

  A.其中有一个是Delete B.一个是Select,另一个是Update

  C.两个都是Select D.两个都是Update

  简答题

  1.Java事务的类型

  2.Serializable简述

  3.Spring事务

  4,事务的隔离级别有哪些。