面试题总结(有空就更新)

本文详细解释了JavaScript中的回调函数与Java回掉函数的区别,介绍了数据库事务的概念及其ACID属性,以及SQL中的左连接与右连接的区别。通过实例代码,帮助开发者更好地理解和应用这些技术。

1、javascript的callback函数和java的回掉函数的区别

       在JavaScript里什么叫Callback“回调函数”,用我的话来讲就是把方法b当做一个参数传递个方法a,当方法a执行完后执行另外一个指定函数(这里是b函数)。

<html>     
	<head>        
	  <title>Callback function test</title>   
		 <script language="javascript" type="text/javascript">   
		  function main(callback)   
		 {      
			  alert("I am main function");   
			 alert("Invoke callback function..");   
			 callback();   
		}   
		 function b(){   
			alert("I am callback function: b");   
		 }   
		function c(){   
			 alert("I am callback function: c");   
		}   
			
		function test() {   
			 main(b);   
			main(c);   
		 }   
		   
		 </script>   
	</head>   
	
	<body>   
		 <button onClick="test()">click me</button>   
	</body>   
</html>   


这里面main(b),那么b就称作回调函数,是不是很好理解?那有人会说我为什么不可以把b的调用放到main函数里呢?确实可以,但是那样你的main方法就只能调用b了。这里我们将b传递个main,或者a传递个main,那main里面的callback方法就是动态的回调函数。优点就在这里。

       Java中的回掉函数

       所谓的回调,就是程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序。程序员B要让a调用自己的程序b中的一个方法,于是,他通过a中的接口回调自己b中的方法。下面是例子。

public class Caller 
{  
	private MyCallInterface callInterface;  
	
	public Caller() 
	{
	   
	}  
   
	public void setCallFunc(MyCallInterface callInterface) 
	{  
	this.callInterface = callInterface;  
	}  
  
	public void call() 
	{  
	callInterface.printName();  
	}  
}  

  2.  当然需要接口的定义,为了方便程序员B根据我的定义编写程序实现接口。

 

public interface MyCallInterface 
{  
	public void  printName();  
} 

2、数据库中的事务的概念

其实现形式就是将普通的SQL语句嵌入到BeginTran...Commit Tran 中(或完整形式 Begin Transaction...CommitTransaction),当然,必要时还可以使用RollBack Tran 回滚事务,即撤销操作。

 

事务具有ACID属性

即 Atomic原子性, Consistent一致性, Isolated隔离性, Durable永久性

 

自动提交事务每条单独的语句都是一个事务。显式事务每个事务均以BEGIN TRANSACTION语句显式开始,以 COMMIT 或 ROLLBACK 语句显式结束。隐性事务在前一个事务完成时新事务隐式启动,但每个事务仍以 COMMIT 或 ROLLBACK语句显式完成。

 

public int delete(int sID)
{
	dbc = newDataBaseConnection();
	Connection con =dbc.getConnection();
	try
	{
	  con.setAutoCommit(false);     // 更改JDBC事务的默认提交方式
	  dbc.executeUpdate("deletefrom bylaw where ID=" + sID);
	  dbc.executeUpdate("deletefrom bylaw _content where ID=" + sID);
	  dbc.executeUpdate("deletefrom bylaw _affix where bylawid=" + sID);
	  con.commit();                         //提交JDBC事务
	  con.setAutoCommit(true);      // 恢复JDBC事务的默认提交方式
	  dbc.close();
	  return 1;
	}
 catch (Exception exc)
	{
	  con.rollBack();//回滚JDBC事务
	  exc.printStackTrace();
	  dbc.close();
	  return -1;
	}
} 


 

3、sql语句的left join和right join的区别隐性事务在前一个事务完成时新事务隐式启动,但每个事务仍以 COMMIT 或 ROLLBACK

   Left Join[左联结]
            返回包括左表中的所有记录和右表中联结字段相等的记录

Right Join[右联结]
  返回包括右表中的所有记录和右表中联结字段相等的记录

Inner Join[等值联结]
         只返回两个表中字段相等的行

 

表A记录如下:           
aID     aNum  
1     a20050111  
2     a20050112  
3     a20050113  
4     a20050114  
5     a20050115  

表B记录如下:  
bID     bName  
1     2006032401  
2     2006032402  
3     2006032403  
4     2006032404  
8     2006032408  

 

1.left join  

sql语句如下:   select * from A  left join B   on A.aID = B.bID  

 

结果如下:  
aID     aNum     bID     bName  
1     a20050111    1     2006032401  
2     a20050112    2     2006032402  
3     a20050113    3     2006032403  
4     a20050114    4     2006032404  
5     a20050115    NULL     NULL  

2.right join  
sql语句如下:   
select * from A  right join B   on A.aID = B.bID  

 

结果如下:  
aID     aNum     bID     bName  
1     a20050111    1     2006032401  
2     a20050112    2     2006032402  
3     a20050113    3     2006032403  
4     a20050114    4     2006032404  
NULL     NULL     8     2006032408 

 

结果说明:  
仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充.

 

3.inner join  
sql语句如下:   
select * from A  innerjoin B  on A.aID = B.bID  

结果如下:  
aID     aNum     bID     bName  
1     a20050111    1     2006032401  
2     a20050112    2     2006032402  
3     a20050113    3     2006032403  
4     a20050114    4     2006032404  

结果说明:  
很明显,这里只显示出了 A.aID = B.bID的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录.  

4、数据库并发

1、在数据库中为什么要并发控制?

数据库是共享资源,通常有许多个事务同时在运行。当多个事务并发地存取数据库时就会产生同时读取和/或修改同一数据的情况。若对并发操作不加控制就可能会存取和存储不正确的数据,破坏数据库的一致性。所以数据库管理系统必须提供并发控制机制。

2、并发操作可能会产生哪几类数据不一致?用什么方法能避免各种不一致的情况?

并发操作带来的数据不一致性包括三类:丢失修改、不可重复读和读“脏’数据。

 

1、丢失修改(lost update ) 两个事务 Tl 和T2读入同一数据并修改,T2提交的结果破坏了(覆盖了) Tl 提交的结果,导致 Tl 的修改被丢失。

2、不可重复读( Non 一 Repeatable Read ) 不可重复读是指事务 Tl 读取数据后,事务几执行更新操作,使 Tl 无法再现前一次读取结果。

3、读“脏”数据( Dirty Read ) 读“脏’数据是指事务 Tl 修改某一数据,并将其写回磁盘,事务几读取同一数据后, Tl 由于某种原因被撤销,这时 Tl 已修改过的数据恢复原值,几读到的数据就与数据库中的数据不一致,则几读到的数据就为“脏”数据,即不正确的数据。避免不一致性的方法和技术就是并发控制。最常用的技术是封锁技术。也可以用其他技术,例如在分布式数据库系统中可以采用时间戳方法来进行并发控制。

3、什么是封锁?基本的封锁类型有几种?试述它们的含义

封锁就是事务 T 在对某个数据对象例如表、记录等操作之前,先向系统发出请求,对其加锁。加锁后事务 T 就对该数据对象有了一定的控制,在事务 T 释放它的锁之前,其他的事务不能更新此数据对象。封锁是实现并发控制的一个非常重要的技术。

 

5、并发和并行

关于并发 和 并行 最好的解释:

你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。
你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。
你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。

吃饭的时候先接电话跟后接电话的比较更像是中断优先级高低的不同。
并发应该是一手筷子,一手电话,说一句话,咽一口饭。 
并行是咽一口饭同时说一句话,而这光靠一张嘴是办不到的,至少两张嘴。


并发的关键是你有处理多个任务的能力,不一定要同时。
并行的关键是你有同时处理多个任务的能力。


所以我认为它们最关键的点就是:是否是『同时』。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值