上海面试经常遇到的事务安全问题
众所周知,北京集结了一大批大型甚至顶尖互联网公司,而在上海却是集结了为数众多的外包公司,也因为金融中心的原因,所以涉及银行保险等行业也是非常多,所以到了上海,如果你没有特定的面试企业,那么就会经常遇到金融保险公司,而这些公司则对安全非常重视,不重视都不行。因这种氛围导致整个上海的软件开发都分外重视安全。我的同学面试遇到了很多这样的情况,特总结一下,供大家参考。后面的简答题也很重要,但是篇幅有限制,只能列出题目供大家参考。
而事务就是其一。
--用实例来说明:
--创建银行账户表
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,事务的隔离级别有哪些。
转自java部落https://buluo.qq.com/p/detail.html?bid=11148&pid=7659220-1482997621