问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Java 编程 ,事务管理的作用

发布网友 发布时间:2022-04-07 19:28

我来回答

4个回答

懂视网 时间:2022-04-07 23:49

);

  现在可以使用通常的方法创建一个语句对象:

Statement stat = conn.createStatement();

然后任意多次调用executeUpdate方法:

stat.executeUpdate(command1);
stat.executeUpdate(command2);
stat.executeUpdate(command3);
...

如果执行了所有命令之后没有出错,则调用commit方法:

conn.commit();

如果出现错误,则调用:

conn.rollback();

此时,程序将自动撤销自上次提交以来的所有语句。当事务被SQLException异常中断时,典型的方法就是发起回滚操作。

1. 保存点

  在使用某些驱动程序时,使用保存点(save point)可以更细粒度地控制回滚操作。创建一个保存点意味着稍候只需返回到这个点,而非事务的开头。例如,

Statement stat = conn.createStatement(); //开启一个事务;rollback()返回这里
stat.executeUpdate(command1);
Savepoint svpt = conn.setSavepoint(); //设置保存点;rollback(svpt)返回到这里
stat.executeUpdate(command2);
if(...) conn.rollback(svpt); //撤销command2产生的影响
...
conn.commit();

  当不再需要保存点时,必须释放它:

conn.releaseSavepoint(svpt);

2. 批量更新

  假设有一个程序需要执行许多INSERT语句,以便将数据填入数据库表中,此时可以使用批量更新的方法来提高程序性能。在使用批量更新(batch update)时,一个语句序列作为一批操作将同时被收集和提交。

注意:使用DatabaseMetaData接口中的supportsBatchUpdates方法可以获知数据库是否支持这种特性。

  处于同一批中的语句可以是INSERT、UPDATE和DELETE等操作,也可以是数据库定义语句,如CREATE TABLE和DROP TABLE。但是,在批量处理中添加SELECT语句会抛出异常(从概念上讲,批量处理中的SELECT语句没有意义,因为它会返回结果集,而不更新数据库)。

  为了执行批量处理,首先必须使用通常的办法创建一个Statement对象:

Statement stat = conn.createStatement();

  现在应该调用addBatch方法,而非executeUpdate方法:

String command = "CREATE TABLE..."
stat.addBatch(command);

while(...){
 command = "INSERT INTO ... VALUES("+...+")";
 stat.addBatch(command);
}

  最后,提交整个批量更新语句:

int[] counts = stat.executeBatch();

  调用executeBatch方法将为所有已提交的语句返回一个记录数的数组。

  为了在批量模式下正确地处理错误,必须将批量执行的操作视为单个事务。如果批量更新在执行过程中失败,那么必须将它回滚到批量操作开始之前的状态。

  首先,关闭自动提交模式,然后收集批量操作,执行并提交该操作,最后恢复最初的自动提交模式:

boolean autoCommit = conn.getAutoCommit();
conn.setAutoCommit(false);
Statement stat = conn.getStatement();
...
//keep calling stat.addBatch(...);
...
stat.executeBatch();
conn.commit();
conn.setAutoCommit(autoCommit);

 

Java数据库编程——事务

标签:

热心网友 时间:2022-04-07 20:57

事务就是对一系列的数据库操作进行统一的提交或回滚操作,比如说做一个转账功能,要更改帐户两边的数据,这时候就必须要用事务才能算是严谨的做法。要么成功,要么失败,保持数据一致性。如果中间有一个操作出现异常,那么回滚之前的所有操作。
这样有什么好处呢。
这样可以防止在一些意外(例如说突然断电)的情况下出现乱数据,防止数据库数据出现问题。这边加了钱,那边却还是一样的数,这就完了。要是开放一个网上交易的平台,这样就会出大问题的!
还有其他的一些操作,像是要添加多条数据,如果程序要求必须全部正确才能插入的话,事务又起大作用了。
等等。。。开发中为了避免这种情况一般都会进行事务管理。

在JDBC中是通过Connection对象进行事务管理的,默认是自动提交事务,可以手工将自动提交关闭,通过commit方法进行提交,rollback方法进行回滚,如果不提交,则数据不会真正的插入到数据库中。

Hibernate中是通过Transaction进行事务管理,处理方法与JDBC中类似。

Spring中也有自己的事务管理机制,使用TransactionMananger进行管理,可以通过Spring的注入来完成此功能。

热心网友 时间:2022-04-07 22:15

---------------------------------------------------------
这个问题我以前回答过别人的,请参考http://zhidao.baidu.com/question/191543132.html

有不明白的地方,直接百度HI 我吧

Spring提供的事务管理可以分为两类:编程式的和声明式的。

编程式的,比较灵活,但是代码量大,存在重复的代码比较多;声明式的比编程式的更灵活方便。

1、传统使用JDBC的事务管理

以往使用JDBC进行数据操作,使用DataSource,从数据源中得到Connection,我们知道数据源是线程安全的,而连接不是线程安全的,所以对每个请求都是从数据源中重新取出一个连接。一般的数据源由容器进行管理,包括连接池。例如TOMCAT,WEBSPHERE,WEBLOGIC等这些J2EE商业容器都提供了这个功能。

以往的我们使用JDBC在写代码时,事务管理可能会是这样:

Connection conn = null;
try{
conn = DBConnectionFactory.getConnection;
conn.setAutoCommit(false);
//do something
conn.commit(); //commit transcation
}catch(Exception e){
conn.rollback();
}
finally{
try{
conn.close();
} catch(SQLException se){ //do sth.}
//close ResultSet,PreparedStatement,Connection
//notice:Maybe ocurr Exception when u close rs,pstmt,conn
}

按照以往的思路来写代码,代码量比较长,而且容易疏忽,忘掉一些try/catch,引发一些异常无法catch,虽然有时候我们会写DBTool类,来关闭这些资源,并且保证在关闭这些资源时,不向外抛异常,但是这样做会导致额外的麻烦。

2、Spring提供的编程式的事务处理

Spring提供了几个关于事务处理的类:TransactionDefinition //事务属性定义

TranscationStatus //代表了当前的事务,可以提交,回滚。

PlatformTransactionManager这个是spring提供的用于管理事务的基础接口,其下有一个实现的抽象类AbstractPlatformTransactionManager,我们使用的事务管理类例如DataSourceTransactionManager等都是这个类的子类。

我们使用编程式的事务管理流程可能如下:

(1) 声明数据源。

(2) 声明一个事务管理类,例如:DataSourceTransactionManager,HibernateTransactionManger,JTATransactionManager等

(3) 在我们的代码中加入事务处理代码:

TransactionDefinition td = new TransactionDefinition();
TransactionStatus ts = transactionManager.getTransaction(td);
try{
//do sth
transactionManager.commit(ts);
}catch(Exception e){transactionManager.rollback(ts);}

使用Spring提供的事务模板TransactionTemplate:

void add()
{
transactionTemplate.execute( new TransactionCallback(){
pulic Object doInTransaction(TransactionStatus ts)
{ //do sth}
}
}

TransactionTemplate也是为我们省去了部分事务提交、回滚代码;定义事务模板时,需注入事务管理对象。

3、Spring声明式事务处理

Spring声明式事务处理也主要使用了IoC,AOP思想,提供了TransactionInterceptor*和常用的代理类TransactionProxyFactoryBean,可以直接对组件进行事务代理。

使用TransactionInterceptor的步骤:

(1)定义数据源,事务管理类

(2)定义事务*,例如:

<bean id =

热心网友 时间:2022-04-07 23:50

Java种运用了大量的事务管理,就是对一系列的数据库操作进行统一的提交或回滚操作,比如说做一个转账功能,要更改帐户两边的数据,这时候就必须要用事务才能算是严谨的做法。要么成功,要么失败,保持数据一致性。如果中间有一个操作出现异常,那么回滚之前的所有操作。
在strut2框架中为了避免多个用户同时访问服务器,都会使用事务管理来管理访问的人数。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
说课包括哪些方面 说课内容包括()。 如何在手机百度上删除对话记录? 结核病是什么样的疾病? 曹丕17岁得了肺痨,明知自己命不长久,还要强争王位,是不是很自私呢?_百... 古代小说常出现的病名 急求一篇"生活小窍门"(500字)的作文 至今最有什么小妙招 健康的戒烟方法 笔记本电池锁死是什么原因引起的? 猪未落牛又起,为啥猪肉涨价直呼吃不起,牛肉涨价却没人抱怨? 畅园(星河湾)怎么样?好不好?值不值得买? 凯美瑞放你们那边寄卖可以吗? 现在都离不开肉,吃不起猪肉的日子在吃什么? bmw z4好不好?多少钱? 当有人说吃不起猪肉的时候,你*式的来了一句,吃不起猪肉可以吃金*鱼,是不是很无耻? 黄文仔领导的星河湾,打造的地产项目都分布在哪些城市呢? 刘德华搞笑猪肉图片多少钱一斤,吃不起了 寻→刘德华QQ搞笑表情,关于表情上说的是:“猪肉贵吃不起!’拜托各位了 3Q 奔驰车上RADIO是个什么功能键 我的车只有收音机 Z4怎么区分? 蓝牙是什么东东 我的sony st25i 连接蓝牙耳机第一次好使,后来好像设置了附件连接什么的,蓝牙耳机没声音了但是能连接上! 手机上的蓝牙耳机是怎么个东东?小妹不懂请赐教? 华为畅享7手机怎么设置蓝牙链接 Word的表格插入图片剪贴画显示空白? 粘贴到word文档里的图片只显示一点其余都是空白是什么原因 华为mate20pro连接车载蓝牙,可以放歌,却接不了电话,如何解决? word插入表格,表格里面有图片,导致前一页页面下面出现空白 朋友说:猪肉太贵,吃不起。 怎么幽默回复? 安徽男子家中藏26只野猪尸体,藏野猪尸体是因为吃不起猪肉了吗? 单元格内斜线怎么弄 这猪肉啊 不是我这些打工能吃得起的 20块一斤 不要说我 就连刘德华都吃不起😭😭 北京房地产公司都有哪些 北方人都吃不起猪肉了, 为什么农户说现在养猪的都快吃不起猪肉了? 天津工作了4,5年,做的是平面设计。这行不讨好干,到现在工资才2000多。请问有没有好的项目可以做? 为什么猪肉价格会持续上涨,都快要吃不起猪肉了? 星河湾地产的设计理念和风格是怎样的? 老百姓吃不起猪肉了? 猪肋排涨价网友直呼吃不起了,为什么会造成这种猪肉涨价的局面? 猪肉什么时候才能降价?工资这么低都吃不起猪肉了 猪价一跌不起,猪肉连跌13周,为何猪肉一直在下跌? 为什么2019来中国人吃不起猪肉谁买单? 真的吃不起猪肉,看不起病了,这该怎么办,工资一千五百块钱,不够用? 吃不起猪肉了。有人听了就对我说,猪肉会导致三高,你应该去吃羊肉牛肉。难道这些人不知道牛羊肉更贵? 吃不起猪肉该怎么办? 为什么最近吃不起猪肉? 哪家公司可以做天津平面设计?