1. 事务是什么?
事务是一组SQL语句,要么全部执行成功,要么全部执行失败。通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元)
事物的开启:start transaction
事务的提交:COMMIT
事务的回滚:ROLLBACK (TO ??)
事务的关闭:CLOSE
2. 事务的四个隔离级别
- 脏读:当一个事务读取了另外个事务尚未提交的修改时,产生脏读
- 不可重复读:由于其他事务做的修改或删除并提交后,每次结果不同此时发生不可重复读
- . 幻读:在一个事务中读取到了别的事务插入并提交后的数据,导致前后不一致
读未提交(read uncommitted)
读未提交,即能够读取到没有被提交的数据,所以很明显这个级别的隔离机制无法解决脏读、不可重复读、幻读中的任何一种。
读已提交 (read committed)
读已提交,即能够读到那些已经提交的数据,自然能够防止脏读,但是无法限制不可重复读和幻读
可重复读(repeatable read)
可重复读,读取了一条数据,这个事务不结束,别的事务就不可以改这条记录,这样就解决了脏读、不可重复读的问题,
串行化(serializable)
串行化,多个事务时,只有运行完一个事务之后,才能运行其他事务。
加锁
当表被另外个事务操作时并未提交,当前表无法操作那张表
————————————————
版权声明:本文为CSDN博主「姑娘加油」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_37937537/article/details/83719978
Connection connection=null;
String sql="update account set balance = balance-100 where id= 1";
String sql2="update account set balance =balance +100 where id =2";
PreparedStatement preparedStatement=null;
try {
connection= JDBCUtils.getConnection();
connection.setAutoCommit(false); //开启事务,相当于最初的保存点
preparedStatement=connection.prepareStatement(sql);
preparedStatement.executeUpdate();
// Savepoint a = connection.setSavepoint();//设置保存点
int k=2/0;
preparedStatement = connection.prepareStatement(sql2);
preparedStatement.executeUpdate();
connection.commit();
} catch (SQLException throwables) {
System.out.println("撤销");
try {
connection.rollback();
} catch (SQLException e) {
e.printStackTrace();
}
throwables.printStackTrace();
}finally {
JDBCUtils.close(null,preparedStatement,connection);
}