任何基于锁的并发系统都不可避免地具有可能在某些情况下发生阻塞的特征。当一个
连接控制了一个锁,而另一个连接需要冲突的锁类型时,将发生阻塞。其结果是强制第二
个连接等待,或在第一个连接上阻塞。
——
其实所有的死锁最深层的原因就是一个
资源竞争。
表现一:
一个用户 A 访问表 A(锁住了表 A),然后又访问表 B,另一个用户 B 访问表 B(锁住了表 B),
然后企图访问表 A。这时用户 A 由于用户 B 已经锁住表 B,它必须等待用户 B 释放表 B,才
能继续,好了他老人家就只好老老实实在这等了。
同样用户 B 要等用户 A 释放表 A 才能继续这就死锁了。
解决方法:
这种死锁是由于你的程序的 BUG 产生的,除了调整你的程序的逻辑别无他法。
仔细分析你程序的逻辑:
1:尽量避免同时锁定两个资源;
2: 必须同时锁定两个资源时,要保证在任何时刻都应该按照相同的顺序来锁定资源。
表现二:
用户 A 读一条纪录,然后修改该条纪录,这是用户 B 修改该条纪录,这里用户 A 的事务
里锁的性质由共享锁企图上升到独占锁(for update),而用户 B 里的独占锁由于 A 有共享锁
存在所以必须等 A 释放掉共享锁,而 A 由于 B 的独占锁而无法上升的独占锁也就不可能
释放共享锁,于是出现了死锁。
这种死锁比较隐蔽,但其实在稍大点的项目中经常发生。
解决方法:
让用户 A 的事务(即先读后写类型的操作),在 select 时就是用 Update lock
7
、什么是事务? 使用事务的语句有哪些?
答:事务是一种机制,是一个操作序列,它包括了一组数据库操作命令,并且所有的命令作
为一个整体向
系统提交或者撤消操作请求,要么全部,要么全部不执行.
begin transaction
commit transaction
rollback transaction
8、在 update 触发器中如何使用修改前,后的数据?
if update(字段 1)
begin
...
end
9、有一职员表,字段有工卡和姓名,写出所有姓名重复的职员信息的 SQL
语句。
答:select * from test where name in(
select name from test group by name having count(name)>1)
10、有两张表 Table1,Table2 ,都只有一个字段。Table 有数据'1','2','3','4',Table2 有'1','3'.
写出一句通用 Sql 语句将表 Table1 的记录同步到 Table2 中!。
答: insert table2 (字段) select '2' union select '4';
11、请谈谈你对 OOP 的理解。