日期:2014-05-16  浏览次数:20525 次

jdbc心得-3-事务、批处理、设置主键

1.事务的概念

?       事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功。

?       例如:A——B转帐,对应于如下两条sql语句

 update from account set money=money+100 where name=‘b’;

 update from account set money=money-100 where name=‘a’;

l    数据库开启事务命令

?       start transaction  开启事务

?       Rollback  回滚事务

?       Commit   提交事务

2.  详解jdbc与数据库事务的连接

当Jdbc程序向数据库获得一个Connection对象时,默认情况下这个Connection对象会自动向数据库提交在它上面发送的SQL语句。若想关闭这种默认提交方式,让多条SQL在一个事务中执行,可使用下列语句:

l    JDBC控制事务语句

?       Connection.setAutoCommit(false);start transaction

?       Connection.rollback(); rollback

?       Connection.commit(); commit

l    设置事务回滚点

?       Savepoint sp = conn.setSavepoint();

?       Conn.rollback(sp);

?       Conn.commit();   //回滚后必须要提交

3.多个线程开启各自事务操作数据库中数据时,数据库系统要负责隔离操作,以保证各个线程在获取数据时的准确性。

l    如果不考虑隔离性,可能会引发如下问题:

l    脏读: 指一个事务读取了另外一个事务未提交的数据。

这是非常危险的,假设A向B转帐100元,对应sql语句如下所示:

   1.updateaccount set money=money+100 while name=‘b’;

   2.updateaccount set money=money-100 while name=‘a’;

   当第1条sql执行完,第2条还没执行(A未提交时),如果此时B查询自己的帐户,就会发现自己多了100元钱。如果A等B走后再回滚,B就会损失100元。

l    不可重复读:  在一个事务内读取表中的某一行数据,多次读取结果不同。

   例如银行想查询A帐户余额,第一次查询A帐户为200元,此时A向帐户存了100元并提交了,银行接着又进行了一次查询,此时A帐户为300元了。银行两次查询不一致,可能就会很困惑,不知道哪次查询是准的。

?