日期:2014-05-16 浏览次数:20567 次
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元了。银行两次查询不一致,可能就会很困惑,不知道哪次查询是准的。
?