对于完整性和一致性,看来不少人都混为一谈了。(PS:这个面试官估计也把两者搞混了,呵呵)完整性(integrity)更多是针对实际业务来说的,比如说一个职员ID,不能在一个表里是1,另一个表里却是2;数据库引擎一般通过主外键、触发器等来维护完整性的。一致性(consistency)是事务一个特征,要底层一点。举例来说,针对这个语句:update a set col1=1,col2=2 where id=1(更改一行数据的两列),数据库要保证在任何情况下,都绝不能出现只更改了col1,或只更改了col2的情况,这两列(col1和col2)要么一起被改,要么都没改。还包括内部的索引结构、内部数据字典等数据都要绝对保持一致。
然后,如果你可以保证逻辑一致性,那不使用事务也可以。其实外键也能保持数据额一致性。
我觉得你的面试题可能主要集中在主键、外键、还有按顺序操作(这里可以避免死锁)。
甚至还要设计数据库设计,如果不使用事务,那你的范式估计要最起码的3NF了。
一个操作逻辑有三件事
1.1插入数据到a表(人1负责)
1.2更新数据到b表(人2负责)
1.3删除数据到c表(人3负责)
总控(人4)那么使用4个人来监控呵呵~~
赞同!补充一句,select,insert,update,delete 任何一个单独的t-sql语句,即便没有begin tran ,也是一个隐式的事务。如果真正意义上的不用事务了。 还真是不知道数据库该咋干活....
他是在考你NOSQL的CAP原则么?感觉像是
其实最简单的说就是 在不同的隔离级别上select 操作上什么锁, 这个锁持续到什么时间,,是读完一条释放一条..还是一直持续到事务结束...
读未提交 没有加共享锁而是加的模式锁,所以我们认为他上乐观并发,
读提交 有加共享锁,共享锁是读完一条释放一条,我们认为他是悲观并发.
可重复读 有加共享锁,共享锁持续到事务结束..我们认为他是悲观并发.
可序列化
行版本控制已提交读
快照 这都不写 了..你懂的...这是楼上的问题..楼主的问题很简单
1. 隔离级别
2. 我完全读的时候不让写.. select * from dbo.student with(updlock)
--这就是表锁, 其他人只能读修改不了这不了,这不就数据完整了吗?
如果是不支持分布式事务的数据库, 则需要手工做事务控制, 或是换一个支持的吧...或者, 修改数据的动作在应用层完成(数据cache在应用层, 数据检查均在应用层完成...).
比如有两张表a,表b.
每张表建立个时间戳,正常情况下他们两个的时间戳是一致的,如果a表被更新但是b表没有被更新的话这两张表的时间戳不同