JAVA事务操作
public class TransactionTest {
public static void main(String[] args) throws Exception {
Connection conn = ConnectionFactory.getInstance().getLocalConnection();
int money=0;
ResultSet rt=null;
try {
conn.setAutoCommit(false);
Statement st =conn.createStatement();
String addMoneySql = "update test_user set money=money+50 where uid=1;";
int flag0= st.executeUpdate(addMoneySql);
System.out.println(flag0);
String reduceMoneySql = "update test_user set money=money-50 where uid=3";
int flag1 =st.executeUpdate(reduceMoneySql);
System.out.println(flag1);
String queryMoneySql="select money from test_user where uid=3";
rt=st.executeQuery(queryMoneySql);
if(rt.next()){
money=rt.getInt("mone");//这里故意将字段打错,检验java如何执行事务的,原字段为money
System.out.println(money);
}
if(money<=700){
throw new RuntimeException("3号的钱已经不够了,不要汇款了");//抛出一个异常,在异常处理中回滚操作
}
conn.commit();
} catch (Exception e) {
e.printStackTrace();//打印出上面抛出来的异常,否则是不会显示的。
if(conn!=null){
conn.rollback();
}
}
}
}
执行这段代码。发现结果为:
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910)
at com.mysql.jdbc.ResultSet.findColumn(ResultSet.java:987)
at com.mysql.jdbc.ResultSet.getInt(ResultSet.java:2749)
at TransactionTest.main(TransactionTest.java:26)
在异常发生后,catch住异常,执行了回滚操作,查看数据库,数据库数据并没有发生变化。但是用update执行的结果来看,update是执行了的。这就说明java处理数据库的事务的执行策略:先挨句执行(下一句的基本数据是上一句执行完毕的数据,而不是数据库真实的数据),当出现回滚时候,直接通知数据库回滚。数据库回滚以后并不会通知java,所以就会出现打印执行结果与数据库数据不一致的情况。
本站文章为和通数据库网友分享或者投稿,欢迎任何形式的转载,但请务必注明出处.
同时文章内容如有侵犯了您的权益,请联系QQ:970679559,我们会在尽快处理。