13-jdbc分页+事务

一、 jdbc分页

1. 什么是分页

在数据量较大的情况下,我们会数据分作多页显示,让用户浏览起来更加的方便,可以根据页码去翻阅每一页的数据

 

2. 如何实现分页的分析

说到分页,一般都会立刻想到先将数据存入集合,再将数据分作多页显示,这样的做法固然可以,可是一旦数据量较大的话就会造成内存的溢出,再者说,大部分用户的浏览习惯都是只看前三页,如果数据总共有100页,那就完全没必要将数据全部从数据库中查出来了,所以一个普遍的实现方式都是根据用户需要浏览的页码,从数据库中查询一页的数据供用户浏览

 

分页的目的就是为了更加合理地做页面显示,所以首先要解决的就是页面需要显示哪些数据

通常来讲,页面上会显示当前页的信息、当前第几页、总共多少页、页码、上一页、下一页等信息

我们可以使用一个 Page
对象来封装页面需要实现的数据

在service中计算出 Page
对象所需的数据

Service中需要的一些来自于数据库的数据就找 Dao
索取

 

3. 分页的具体实现

1)根据需求设计Page对象

2)dao的实现

       两个方法

       int getTotalRecord();     //
获得总记录数

       List getPageData(int start, int len);  //
获得分页数据

3)service
实现

       Page getPage(int pageNum);  //
计算分页数据

4)Servlet

       获得页面提交的 pageNum

       找service计算出分页数据  Page

       转发给jsp
做分页显示

 

二、 jdbc 事务

1. 什么是事务

所谓事务,就是针对数据库的一组操作(多条sql)

特点:位于同一个事务的操作具备同步的特点,也就是要么都成功,要么都失败

 

2. 事务的作用

在实际中,我们的很多操作都是需要由多条sql来共同完成的,例如,A账户给B账户转账就会对应两条sql

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

update account set money=money+100 where name=‘b’;
提交事务   提交事务中的所有操作

假设第一条sql成功了,而第二条sql失败了,这样就会导致a账户损失了100元,而b账户并未得到100元

 

如果将两条sql放在一个sql中,当第二条语句失败时,第一条sql语句也同样不会生效,

这样a账户就不会有任何的损失

 

 

3. 事务的实现原理

默认情况下,我们向数据库发送的sql语句是会被自动提交的,开启事务就是相当于关闭自动提交功能,改为手动提交,我们只需要将提交事务的操作放在最后一个操作,这样一来,如果在提交事务之前出现异常,由于没有执行提交操作,事务中未提交的操作就会被回滚掉

 

4. 例子

account.sql

create table account(

       id int primary key auto_increment,

       name varchar(40),

       money float

)character set utf8 collate utf8_general_ci;

 

insert into account(name,money) values('aaa',1000);

insert into account(name,money) values('bbb',1000);

insert into account(name,money) values('ccc',1000);

 

aaa 给 bbb
转账 100元

update account set money=money-100 where name='aaa';

// 异常退出

update account set money=money+100 where name='bbb';

 

// 查询结果

select * from accont;

 

如果开启事务就可以避免刚才的错误发生

// 开启事务

start transaction;

 

// 如果操作执行完毕,我们需要将事务提交

commit;

 

// 还可以手动回顾事务中所有未提交的事务

rollback;

 

命令行做实验得出结论:

如果开了一个事务,又敲了一次 start transaction
再次开启事务,前一个事务会自动提交

 

5、在程序中使用 jdbc 开启事务

在使用 jdbc
操作数据库时,需要使用 Connection 对象对事务进行管理

// 开启事务

Connection.setAutoCommit(false);       //设置自动提交为false

// 回滚事务

Connection.rollback();  

//提交事务

Connection.commit();   

 

在 jdbc
程序中我们还可以设置回滚点,让事务回顾到指定的回滚点,而不是自动回滚所有未提交的操作

需要将程序中的异常捕获,在catch语句块中回滚事务,在finally中提交事务

注意,将 Commit
操作放在 finally 中是为了保证提交未回滚的事务操作

 

6. 事务的特性

事务有四大特性,一般来讲,判断一个数据库是否支持事务,就看数据库是否支持这四个特性

l  原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 

 

l  一致性(Consistency)
事务必须使数据库从一个一致性状态变换到另外一个一致性状态。

 

l  隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

 

l  持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

 

7. 事务的隔离级别

1)多线程开启事务

       由于数据库是多线程并发访问的,所以很容易出现多个线程同时开启事务的情况

       多线程开事务容易引起赃读、不可重复读、幻读的情况发生

 

      
赃读:dirty read

       是指一个事务读取了另一个事务未提交的数据,这是相当危险的。

       设想一下,A要给B转账100元购买商品,如果A开启了一个事务做了转账的工作

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

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

       A先不提交事务,通知B来查询

       这时B来查询账户,由于会读到A开启的事务中未提交的数据,就会发现A确实给自己转了100元,

       自然就会给A发货,A等B发货后就将事务回滚,不提交,此时,B就会受到损失

      

      
不可重复读:non-repeatable read

       是指事务中两次查询的结果不一致,原因是在查询的过程中其他事务做了更新的操作 update

       例如,银行做报表,第一次查询A账户有100元,第二次查询A账户有200元,原因是期间A存了100元

       这样就会导致银行多次统计的报表不一致

 

和脏读的区别是:

脏读是读取前一事务未提交的脏数据,不可重复读是在事务内重复读取了别的线程已提交的数据。

 

有的时候大家会认为这样的结果是正确的,没问题

我们可以考虑这样一种情况,比如银行程序需要将查询结果分别输出到电脑屏幕和写到文件中,结果在一个事务中针对输出的目的地,进行的两次查询不一致,导致文件和屏幕中的结果不一致,银行工作人员就不知道以哪个为准了。

 

幻读:phantom read   
又名虚读

是指在一个事务内两次查询中数据笔数不一致

幻读和不可重复读有些类似,是指两次查询过程中,其他事务做了插入记录的操作,导致记录数有所增加

insert

 

例如银行做报表统计account表中所有用户的总额时,此时总共

       五个账户,总金额为500元,这时有一个新的账户产生了,并且

       存了100元,这时银行再统计会发现帐户总金额为600元了,造

       成虚读同样会使银行遇到同样的困惑

 

       实验发现不会出现虚读

       来自网络的解释:

       幻读只是在理论上会发生的一种情况,而现实操作中并不是一定会发生

 

2)设置事务的隔离级别

       为了避免多线程开事务引发的问题,我们需要将事务进行隔离

       事务有四种隔离级别,不同的隔离级别可以防止不同的错误发生

      
serializable:可串行化,能避免脏读、不可重复读、幻读情况的发生

repeatable read:可重读,能避免脏读、不可重复读情况的发生(实际上mysql在实现的时候避免了虚读)

read committed:读取提交的内容,可避免脏读情况发生

read uncommitted:读取未提交的内容,最低级别,避免不了任何情况

 

操作:

设置事务隔离级别

set   transaction isolation level

查询当前事务隔离级别

select @@tx_isolation  

 

时间: 2024-08-03 23:27:38

13-jdbc分页+事务的相关文章

mybatis+mysql分页事务问题

问题描述 有一个分页场景,前台通过ajax请求,后台用的mybatis分页插件,以下是插件配置:<propertyname="plugins"><list><beanclass="com.github.miemiedev.mybatis.paginator.OffsetLimitInterceptor"><propertyname="dialect"><beanclass="com.

JDBC事务编程模型备忘

在Spring一统天下的情况下,JDBC快没有生存余地了.不过JDBC还是Java操作数据库的基础,现在Java项目中JDBC的应用快绝迹了,有必要对JDBC的事务编程模型做个象征性的总结. 下面是示例,保证代码可以编译,但不保证能运行,呵呵. import java.sql.*; /** * JDBC编程事务控制模型备忘 * * @author : leizhimin,2008-8-21 14:48:42.<p> */ public class JdbcTxText { public sta

CSDN上看到的一篇有关Spring JDBC事务管理的文章(内容比较全) (转)

  JDBC事务管理 Spring提供编程式的事务管理(Programmatic transaction manage- ment)与声明式的事务管理(Declarative transaction management),为不同的事务实现提供了一致的编程模型,这节以JDBC事务为例,介绍Spring的事务管理.  5.3.1  Spring对事务的支持 事务是一组原子(Atomic)操作的工作单元,以数据库存取的实例来说,就是一组SQL指令,这一组SQL指令必须全部执行成功,若因为某个原因未全

JDBC事务管理及SavePoint示例

默认情况下,当我们创建一个数据库连接时,会运行在自动提交模式(Auto-commit)下.这意味着,任何时候我们执行一条SQL完成之后,事务都会自动提交.所以我们执行的每一条SQL都是一个事务,并且如果正在运行DML或者DDL语句,这些改变会在每一条SQL语句结束的时存入数据库.有时候我们想让一组SQL语句成为事务的一部分,那样我们就可以在所有语句运行成功的时候提交,并且如果出现任何异常,这些语句作为事务的一部分,我们可以选择将其全部回滚. 让我们通过一个简单的示例理解一下,这里使用JDBC的事

Java JDBC学习实战(三): 事务管理

一. 数据库的事务特性 事务是一步或多步组成操作序列组成的逻辑执行单元,这个序列要么全部执行,要么则全部放弃执行. 事务的四个特性:原子性(Atomicity).一致性(Consistency).隔离性(IsoIation)和持续性(Durability)原子性(Atomicity):事务应用最小的执行单元,不可再分.是事务中不可再分的最小逻辑执行体. 一致性(Consistency):事务的执行结果,必须使数据库的从一个一致性的状态变到另一个一致性的状态. 隔离线(IsoIation):各个事

Java中JDBC事务与JTA分布式事务总结与区别_java

Java事务的类型有三种:JDBC事务.JTA(Java Transaction API)事务.容器事务.常见的容器事务如Spring事务,容器事务主要是J2EE应用服务器提供的,容器事务大多是基于JTA完成,这是一个基于JNDI的,相当复杂的API实现.所以本文暂不讨论容器事务.本文主要介绍J2EE开发中两个比较基本的事务:JDBC事务和JTA事务. JDBC事务 JDBC的一切行为包括事务是基于一个Connection的,在JDBC中是通过Connection对象进行事务管理.在JDBC中,

JDBC使用游标实现分页查询的方法_java

本文实例讲述了JDBC使用游标实现分页查询的方法.分享给大家供大家参考,具体如下: /** * 一次只从数据库中查询最大maxCount条记录 * @param sql 传入的sql语句 * @param startNo 从哪一条记录开始 * @param maxCount 总共取多少条记录 */ public void getData(String sql,int startNo,int maxCount){ Connection conn = ConnectionUtil.getConnec

深入解析Java中的JDBC事务_java

事务事务是一步或多步组成操作序列组成的逻辑执行单元,这个序列要么全部执行,要么则全部放弃执行.事务的四个特性:原子性(Atomicity).一致性(Consistency).隔离性(IsoIation)和持续性(Durability)原子性(Atomicity):事务应用最小的执行单元,不可再分.是事务中不可再分的最小逻辑执行体. 一致性(Consistency):事务的执行结果,必须使数据库的从一个一致性的状态变到另一个一致性的状态. 隔离线(IsoIation):各个事务的执行互不干扰,任意

在Java的JDBC使用中设置事务回滚的保存点的方法_java

新的JDBC3.0保存点的接口提供了额外的事务控制.他们的环境中,如Oracle的PL/ SQL中的大多数现代的DBMS支持保存点. 当设置一个保存点在事务中定义一个逻辑回滚点.如果发生错误,过去一个保存点,则可以使用rollback方法来撤消要么所有的改变或仅保存点之后所做的更改. Connection对象有两个新的方法,可帮助管理保存点: setSavepoint(String savepointName): 定义了一个新的保存点.它也返回一个Savepoint 对象. releaseSav