数据库分页:limit x,y x开始索引的位置,从零开始,y要取的数量
/**
* 分页
* @param pageNum
* @param page
* @throws SQLException
*/
public static void pageLimite(int pageNum,int page) throws SQLException{
int startIndex = (page-1) * pageNum;//开始位置
//pageNum 页数
//page第几页
//1.查找总条数
ResultSet totalNumSet = getStatement().executeQuery("select * from student");
int totalNum = 0;
while(totalNumSet.next()){
totalNum++;
}
System.out.println("totalNum------------->"+totalNum);
//2.不够页数,展示余数
if((totalNum - startIndex) < 10){
pageNum = totalNum - startIndex;
}
//3.执行分页查询
ResultSet executeQuery = getStatement().executeQuery("SELECT * FROM student limit "+startIndex+","+ pageNum);
while(executeQuery.next()){
System.out.println("id--------------->"+executeQuery.getInt("id"));
System.out.println("name---------->"+executeQuery.getString("name"));
System.out.println("description----------->"+executeQuery.getString("description"));
System.out.println();
}
}
事务:
Transaction,是一个操作序列,这些操作要么都执行,要么都不执行,简而言之:就是执行几个sql语句,当所有的语句都执行成功,那么就成功,如果其中一个执行失败,那么成功执行的也不会提交,都是失败的。
从上面可以看出,事务的提出,是为了解决并发情况下保持数据一致性的问题,要么都执行,要么都不执行。
事务的特性:
1.原子性(Atomic) 把事务中的操作看做是一个不可分割的单元,这个单元中的操作要么都执行成功,要么都执行失败。
2.一致性(Consistency) :事务必须使数据库从一个一致性状态到另外一个一致性状态。
3.隔离性(Isolation): 事务的隔离性是多个用户并发访问数据库的时候,数据库为每个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
4.持久性(Durability): 持久性是指一个事务一旦被提交,它对数据库中的数据的改变就是永久性的。
jdbc中使用事务:
Connection.setAutoCommit(false); //设置自动提交
Connection.rollback(); //程序回滚
Connection.commit(); //提交事务
设置事务回滚点
Savepoint sp = conn.setSavepoint();
Conn.rollback(sp);
注意:事务回滚后一定要将事务提交
在具体的应用中,有很多人在同一个时刻操作数据,如果其中有一个操作失败,那么所有的都失败。还有就是前后两次数据的查询结果不一致,原因是在这个时候有人执行了更新操作。等等问题。
这样的问题有:脏读,幻读,不可重复读。
脏读:指一个事务读取了另外一个事务未提交的数据。
这是非常危险的,假设A向B转帐100元,对应sql语句如下所示
update account set money=money+100 while name=‘b’;
update account set money=money -100 while name=‘a’;
当两条语句位于同一事务时,当执行完sql事务还未提交时,B查询自己的帐户,会发现自己多了100元钱。此时,A等B查询完账户后可以将事务回滚,这样B就会损失1 00元。
不可重复读:是指在一个事务内两次查询的数据不一致,原因是在两次查询的过程中,另一事务更新了原有数据
例如银行想查询A帐户余额,第一次查询A帐户为200元,此时A向帐户内存了100元并提交了,银行接着又进行了一次查询,此时A帐户为300元了。银行两次查询不一致 ,就会导致最终多份报表结果不一致
和脏读的区别是,脏读是读取前一事务未提交的脏数据,不可重复读是在事务内重复读取了别的线程已提交的数据。
幻读:也称虚读,是指在一个事务内两次查询中数据笔数不一致,事务1查询到几行数据,而事务2却在此时插入了几行新数据,当事务1再次查询时,会发现多了几行类似虚幻 的数据
例如银行做报表统计account表中所有用户的总额时,此时总共
五个账户,总金额为500元,这时有一个新的账户产生了,并且
存了100元,这时银行再统计会发现帐户总金额为600元了,造
成虚读同样会使银行遇到同样的困惑
MySql数据库共定义了四种隔离级别:
serializable:可串行化,能避免脏读、不可重复读、幻读情况的发生
repeatable read:可重读,能避免脏读、不可重复读情况的发生
read committed:读取提交的内容,可避免脏读情况发生
read uncommitted:读取未提交的内容最低级别,避免不了任何情况。