精华内容
下载资源
问答
  • UserTransaction

    2008-02-20 10:14:19
    [code="...public class UserTransaction { private static Map threadDbconnectionMap = new HashMap(); public void begin() { dataSource.getConnection().setAutoCommit(false); ...

    public class UserTransaction {
    private static Map threadDbconnectionMap = new HashMap();
    public void begin() {
    dataSource.getConnection().setAutoCommit(false);
    threadDbConnectionMap.put(Thread.currentThread(), dataSource.getConnection());
    dataSource.getConnection().startTransaction();
    }

    public void commit() {
    dataSource.getConnection().commitTransaction();
    threadDbConnectionMap.remove(Thread.currentThread());
    }
    }

    public class DataSource {
    private static Map threadDbConnectionMap = new HashMap();
    public Connection getConnection() {
    if(threadDbConnectionMap.get(Thread.currentThread()) == null) {
    threadDbConnectionMap.put(Thread.currentThread(), DBCONNECTION_POOL.getConnection);
    }
    return (Connection)threadDbConnectionMap.get( Thread.currentThread());
    }
    }

    UserTransaction的机制就是建立一个currentThread和一个 DBconnection的map,使得在同一个thread下的所有db operation使用同一个connection,这样通过背后的同一个connection的commit或rollback来保证 transaction的atomic


    public class DBConnectionPool {
    // singleton Pattern
    public Connection fetchConnection() ;
    public void releaseConnection(Connection conn);
    }

    public class ThreadConnectionMap {
    // singleton pattern.
    private Map threadConnectionMap = new HashMap();

    public Connection getConnection() {
    if(threadConnectionMap.get(Thread.currentThread()) != null) {
    return (Connection)threadConnectionMap.get(Thread.currentThread());
    }
    return DBConnectionPool.fetchConnection();
    }

    public Connection getConnectionInTx() {
    return (Connection)threadConnectionMap.get(Thread.currentThread());
    }

    public void releaseConnectionInTx() {
    Connection con = getConnectionInTx();
    threadConnectionMap.remove(Thread.currentThread());
    DBConnectionPool.releaseConnection(con);
    }

    public Connection newConnectionInTx() {
    if(inTransaction()) {
    throw new TransactionException("Transaction already started!");
    }
    Connection conn = DBConnectionPool.fetchConnection();
    threadConnectionMap.put(Thread.currentThread(), conn);
    return conn;
    }

    public boolean inTransaction() {
    return threadConnectionMap.get(Thread.currentThread()) != null;
    }

    ..............
    }

    public class VendorDataSource() implements javax.sql.DataSource {
    public Connection getConnection() {
    return ThreadConnectionMap.getConnection();
    }

    ..........
    }

    public class VendorUserTransaction implements javax.transaction.UserTransaction {
    public void begin() {
    Connection con = ThreadConnectionMap.newConnectionInTx();
    con.setAutoCommit(false);
    }
    public void commit() {
    Connection con = ThreadConnectionMap.getConnectionInTx();
    if(con == null) {
    throw new TransactionException("cannot commit transaction, UserTransaction not started!");
    }

    con.commit();
    ThreadConnectionMap.releaseConnectionInTx();
    }
    public void rollback(){
    Connection con = ThreadConnectionMap.getConnectionInTx();
    if(con == null) {
    throw new TransactionException("cannot rollback transaction, UserTransaction not started!");
    }

    con.rollback();
    ThreadConnectionMap.releaseConnectionInTx();
    }

    public boolean inTransaction() {
    return ThreadConnectionMap.inTransaction();
    }
    ....
    }


    以上是没有考虑XA(distributed transaction)和连接多个数据库情况的TransactionManager的实现,非常简陋,只是用于说明JTA的原理

    [color=red]1。由于你只是使用了web server,没有采用application server,你的application又需要提供Transaction的control,唯一的办法是提供你自己的Transaction Manager,而不是使用UserTransaction(正如你所说的,web server不提供UserTransaction)。UserTransaction也是一种TransactionManager,由J2EE Container提供。

    2。你的“dbConnection.setAutoCommit(true)”这个调用是错误的。如果你调用该语句,dbConnection就会每次execute一句sql以后自动commit了,这样你的程序中本身需要放在同一个transaction中执行的代码分散在了好几个不同的transaction中执行了,就会导致partial update的问题,data consistency就没有办法保证。

    3。“死锁”的问题应该是你程序中的问题,而不应该归咎于dbConnection是否是 auto commit的。我在以前曾经写过一个自己的TransactionManager,就是通过建立一个Thread和dbConnection的map来实现的。刚开始测试这个TransactionManager的时候,也是经常出现“死锁”的问题,最后debug的结果发现并不是auto commit的问题,而是对于thread synchronization的问题处理不得当所导致的。

    4。“手动地为每一个更新都编写一个恢复原始数据的方法”是错误的。试想想,如果在你手动恢复数据的过程中又出现了Exception,你又如何保证data consistency呢?

    5。自己编写TransactionManager是一件比较复杂的工作,不是我想建议的。这也是为什么banq强烈推荐EJB的原因。EJB提供了TransactionManager的功能,我们可以采用EJB的解决方案,just off-the-shelf,不是吗?或者用JTA和DataSource一道实现Transaction的control。

    6。如果你必须要采用自己编写的TransactionManager,我可以讲解一下J2EE CONTAINER所提供的JTA/JTS的实现原理,或许对于你编写自己的TransactionManager有一定的帮助。

    7。我们知道在J2EE Spec中提供了UserTransaction和DataSource的interface的定义,具体是如何实现的留给那些J2EE Container的vendor来实现,对于application developer来说他所能见到的就是这两个interface。对于支撑这两个interface背后的东西,application developer是永远都不可能知道的。看看下面的architecture吧

    User-defined Application API
    ----------------------------
    UserTransaction DataSource
    ----------------------------
    DBConnectionPool ThreadConnectionMap
    (XAConnection, XAResource, XADataSource)

    我们清楚的看到,对于UserTransaction,DataSource的支持离不开我们所看不到的J2EE spec中的一些定义,对于application developer来说,它隐藏了这些东西的复杂性。与application developer打交道的只是UserTransaction和DataSource。[/color]

    http://www.jdon.com/jivejdon/thread/12894.html
    展开全文
  • usertransaction test failure

    2020-12-09 10:47:06
    <div><p>usertransaction test failure <p>glassfish-3.1-b04.zip Some test cases in usertransaction tests failed on b04, while passed on b03. <p>To reproduce the issue: With sqe test env, and in in app...
  • 关于UserTransaction

    2013-11-02 08:29:05
    ...public class UserTransaction { private static Map threadDbconnectionMap = new HashMap(); public void begin() { dataSource.getConnection().setAutoCommit(false); thr...

     

    public class UserTransaction {
        private static Map threadDbconnectionMap = new HashMap();
        public void begin() {
            dataSource.getConnection().setAutoCommit(false);
            threadDbConnectionMap.put(Thread.currentThread(), dataSource.getConnection());    
            dataSource.getConnection().startTransaction();
        }
    
        public void commit() {
            dataSource.getConnection().commitTransaction();
            threadDbConnectionMap.remove(Thread.currentThread());        
        }
    }
    
    public class DataSource {
        private static Map threadDbConnectionMap = new HashMap();    
        public Connection getConnection() {
           if(threadDbConnectionMap.get(Thread.currentThread()) == null) {
              threadDbConnectionMap.put(Thread.currentThread(), DBCONNECTION_POOL.getConnection);
           }
              return (Connection)threadDbConnectionMap.get(      Thread.currentThread());
        }
    }



    UserTransaction的机制就是建立一个currentThread和一个DBconnection的map,使得在同一个thread下的所有db operation使用同一个connection,这样通过背后的同一个connection的commit或rollback来保证transaction的atomic

    展开全文
  • <div><p>When Weld TCK tests expect a USerTransaction to be injected, it expects org.jboss.weld.transaction.spi.TransactionServices implementation in glassfish to return a UserTransaction instance when...
  • UserTransaction". Need to replace it with the equivalent portable name "java:comp/UserTransaction" <p>The publishing of "UserTransaction" name will be removed in ...
  • <div><p>UserTransaction should not be available for lookup with CMT. <h4>Environment <p>Operating System: All Platform: Sun <h4>Affected Versions [V3]</p><p>该提问来源于开源项目:eclipse-ee4j/...
  • 原项目使用的是weblogic通过这种方式获取UserTransaction, <p>public static UserTransaction getUserTransaction() throws NamingException, SystemException {<!-- -->  Context ctx = new ...
  • A UserTransaction is started by an Application Client 2. Some Remote Methods of a Stateful Session Bean implementing the SessionSynchronization Interface are invoked within the Transaction by the ...
  • UserTransaction Object is not injected and always holds null, no container exceptions exist at all. <p>public class EmployeeForm {<!-- --> <p>// (unitName="WebApplicationPU") private ...
  • <div><p>I observed a NamingFailure [1] to look up UserTransaction from an application and that prompted me to look at the code. This race condition is likely to have been introduced by #13108 where to...
  • JTA的事务管理由UserTransaction管理.

    千次阅读 2017-09-15 10:25:01
    // 回滚处理开始 InitialContext context = new InitialContext(); // JTA的事务管理由... UserTransaction utx = (UserTransaction) context.lookup("UserTransaction"); try { // 开启事物 utx.begin
    // 回滚处理开始
    		InitialContext context = new InitialContext();
    		// JTA的事务管理由UserTransaction管理.
    		UserTransaction utx = (UserTransaction) context.lookup("UserTransaction");
    		try {
    			// 开启事物
    			utx.begin();
    			if (null != ids && idList.size() > 0) {
    				for (String id : idList) {
    					// 根据出借产品 id查询 委托出借信息
    					underLineApprove = underLineApproveLocalBean.getListById(appBean.getClientCode(), id);
    					// 根据出借产品 loan_id查询【募集成功结束时间】
    					if (StringUtils.isBlank(underLineApprove.getTimesettled())) {
    						updIds.add(id);
    						tenderList.add(underLineApprove);
    					}
    				}
    				// 更新委托出借表里的审批状态
    				boolean up = underLineApproveLocalBean
    						.markApprovalStatus(CreditManagerConstant.APPROVAL_STATUS_REFUSE, updIds);
    				if (!up) {
    					utx.rollback();
    					return apiresult.addError("委托出借审批驳回失败!");
    				}
    				// 插入投资信息表
    				if (null != tenderList && tenderList.size() > 0) {
    
    					for (UnderLineApprove ua : tenderList) {					
    						boolean f = userFundService.release(appBean.getClientCode(), ua.getUnderLineUserId(),
    								new BigDecimal(ua.getLoanAmount()));
    						if (!f) {
    							utx.rollback();
    							return apiresult.addError("委托出借审批驳回更新用户资金失败!");
    						}
    						/*						
    						String mchnt_txn_ssn = getNumber(); // 流水号
    						String cust_no = null;// 付款账户(出借人手机号)
    						String amt = null;// 金额
    						String rem = null;
    						// 通过userid获取用户信息
    						User u = userBridge.getUserById(ua.getUnderLineUserId());
    						if (null != u) {
    							cust_no = u.getMobile();// 付款账户(出借人手机号)
    						} else {
    							apiresult.addError("委托出借审批驳回转账:付款账户不存在");
    						}
    						if (StringUtils.isNotBlank(ua.getLoanAmount())) {
    							amt = ua.getLoanAmount();// 金额
    						} else {
    							apiresult.addError("委托出借审批驳回转账:金额不存在");
    						}
    						try {
    							logger.info("委托出借审批批驳回账户解冻: 流水号《" + mchnt_txn_ssn + "》");
    							// 驳回的时候调解冻接口。
    							UnFreezeRspData uf = fuiouService.unFreeze(mchnt_txn_ssn, cust_no, amt, rem);
    							if (uf != null) {
    								if (!uf.getResp_code().equals("0000")) {
    									utx.rollback();
    									return apiresult.addError(uf.getResp_desc());
    								} 
    							}
    							logger.info("委托出借审批驳回账户解冻: 解冻账户 《" + cust_no + " 》 响应消息: " + uf.getResp_desc());
    
    						} catch (Exception e) {
    							logger.error("委托出借审批驳回账户解冻失败: " + e.getMessage());
    							return apiresult.addError("委托出借审批驳回账户解冻失败,请和银行联系。");
    						}*/
    					}
    				}
    			} else {
    				return apiresult.addError("委托出借驳回无驳回记录");
    			}
    			utx.commit();
    		} catch (Exception e) {
    			utx.rollback();
    			return apiresult.addError("委托出借驳回无驳回失败");
    		}

    展开全文
  • A UserTransaction object reference may also be declared in a deployment descriptor in the same way as a resource environment reference." <p>Common Annotation spec also says UserTransaction mapped ...
  • <p>The intention of the EJB 3.0 specification is not to expose the UserTransaction to CMT beans. <p>p448 16.12 in the specification: <p>"The container must not make the UserTransaction interface ...
  • <div><p>The batch runtime is encountering the following exception [1] when it attempts to lookup java:comp/UserTransaction. <p>Anthony, Marina and I have exchanged emails and we are in agreement that ...
  • If an attempt is made to call any method of the UserTransaction interface from within the scope of a bean or method annotated with and a Transactional.TxType other than NOT_SUPPORTED or NEVER, an ...
  • 一、前言今天中午一小伙伴在进行JPA的相关配置时遇到一些疑惑点...二、UserTransaction简析2.1 代码展示请看下面一段代码:1.注意看javax.transaction.UserTransactionimport javax.transaction.UserTransaction;@In...

    一、前言

    今天中午一小伙伴在进行JPA的相关配置时遇到一些疑惑点,自己思考了一下也没有搞明白,就查了一些资料,翻看了之前的一些代码,逐渐搞明白了几点。写一博客分享之。

    二、UserTransaction简析

    2.1 代码展示

    请看下面一段代码:

    1.注意看javax.transaction.UserTransaction

    import javax.transaction.UserTransaction;

    @Inject

    private UserTransaction utx;

    1

    2

    3

    4

    importjavax.transaction.UserTransaction;

    @Inject

    privateUserTransactionutx;

    2.注意看UserTransaction的实例化方式

    private UserTransaction utx = entityManager.getTransaction();

    1

    privateUserTransactionutx=entityManager.getTransaction();

    2.2 官方文档解析

    UserTransaction的Java EE6官方文档是这样定义的:

    The UserTransaction interface defines the methods that allow an

    application to explicitly manage transaction boundaries.

    UserTransaction

    接口定义的方法允许应用程序显式地管理事务边界。

    换言之,UserTransaction是Java EE中用来进行事务管理的一个接口。

    其主要实现方法有如下几个:

    begin()

    getStatus()

    rollback()

    setRollbackOnly()

    setTransactionTimeout(int seconds)

    三、JPA中的事务管理

    3.1 事务管理相关概念理解

    事务的概念:

    事务是应用程序中一系列严密的操作的集合,也就是两个及两个以上操作的集合。事务的特点是,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。

    同时也就意味着事务的结束有两种,当事务中的所以步骤全部成功执行时,事务提交。如果其中一个步骤失败,将发生回滚操作,撤消撤消之前到事务开始时的所以操作。

    事务机制的优势:

    使用事务机制的好处非常明显,例如银行转账之类的交易操作中,事务有着重要的作用。事务的成功取决于事务单元帐户相互依赖的操作行为是否能全部执行成功,只要有一个操作行为失败,整个事务将失败。例如:客户A和客户B的银行账户金额都是10000元人民币,客户A需要把自己帐户中的5000元人民币转到客户B的账户上。这个过程看似简单,实际上涉及了一系列的数据库操作,可以简单地视为两步基本操作,即从客户A帐户的金额中扣除5000元人民币,以及将客户B帐户中金额添加5000元人民币。假设第1步数据库操作成功,而第二步失败的话,将导致整个操作失败,并且客户A帐户金额将被扣除5000元人民币。事务机制可以避免此类情况,以保证整个操作的完成,如果某步操作出错,之前所作的数据库操作将全部失效。

    3.2 JPA中的事务管理

    在JPA中,JPA本身没有提供任何类型的声明式事务管理,所以,为了更好的进行一系列的事务操作和管理,常用的事务管理有容器管理和人为管理。人为管理需要代码实现。

    在JPA中一种实现方式就是调用entityManager的UserTransaction。即:

    UserTransaction utx = entityManager.getTransaction();

    1

    UserTransactionutx=entityManager.getTransaction();

    3.3 JPA中UserTransaction与entityManager的关系

    上述UserTransaction接口由entityManager对象实现,例如:

    // 实例化对象

    UserTransaction utx = entityManager.getTransaction();

    // 开启事务

    utx.begin();

    // 提交事务

    utx.commit();

    1

    2

    3

    4

    5

    6

    // 实例化对象

    UserTransactionutx=entityManager.getTransaction();

    // 开启事务

    utx.begin();

    // 提交事务

    utx.commit();

    四、实例代码展示

    4.1 个人代码

    package cn.edu.sdut.softlab.controller;

    import javax.enterprise.context.RequestScoped;

    import javax.inject.Named;

    import javax.persistence.EntityManager;

    import javax.persistence.EntityManagerFactory;

    import javax.persistence.Persistence;

    import javax.transaction.HeuristicMixedException;

    import javax.transaction.HeuristicRollbackException;

    import javax.transaction.RollbackException;

    import javax.transaction.SystemException;

    import javax.transaction.UserTransaction;

    import cn.edu.sdut.softlab.model.Person;

    @Named("controller")

    @RequestScoped

    public class PersonController {

    //定义全局变量

    EntityManagerFactory emf = null;

    EntityManager em = null;

    //方法2:

    //引入UserTransaction

    //private UserTransaction utx;

    //utx实例化

    utx = em.getTransaction();

    private Person newPerson = new Person();

    // newPerson的getter和setter方法

    public Person getNewPerson() {

    return newPerson;

    }

    public void setNewPerson(Person newPerson) {

    this.newPerson = newPerson;

    }

    // login方法

    public void addPerson() throws IllegalStateException, SecurityException, HeuristicMixedException,

    HeuristicRollbackException, RollbackException, SystemException {

    try {

    //该参数必须与persistence-unit的name相一致

    emf = Persistence.createEntityManagerFactory("PersonUnit");

    em = emf.createEntityManager();

    // 断点测试

    System.out.println("打印输出newPerson: " + newPerson.toString());

    System.out.println("打印输出em: " + em.toString());// 测试结果,EntityManager注入失败

    //方法1:

    em.getTransaction().begin();// 至关重要的一步:开启事务

    em.persist(newPerson);

    em.getTransaction().commit();

    } catch (Exception e) {

    e.printStackTrace();

    } finally {

    em.close();

    emf.close();

    //utx.commit();

    System.out.println("存入成功!");

    }

    }

    }

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    62

    63

    packagecn.edu.sdut.softlab.controller;

    importjavax.enterprise.context.RequestScoped;

    importjavax.inject.Named;

    importjavax.persistence.EntityManager;

    importjavax.persistence.EntityManagerFactory;

    importjavax.persistence.Persistence;

    importjavax.transaction.HeuristicMixedException;

    importjavax.transaction.HeuristicRollbackException;

    importjavax.transaction.RollbackException;

    importjavax.transaction.SystemException;

    importjavax.transaction.UserTransaction;

    importcn.edu.sdut.softlab.model.Person;

    @Named("controller")

    @RequestScoped

    publicclassPersonController{

    //定义全局变量

    EntityManagerFactoryemf=null;

    EntityManagerem=null;

    //方法2:

    //引入UserTransaction

    //private UserTransaction utx;

    //utx实例化

    utx=em.getTransaction();

    privatePersonnewPerson=newPerson();

    // newPerson的getter和setter方法

    publicPersongetNewPerson(){

    returnnewPerson;

    }

    publicvoidsetNewPerson(PersonnewPerson){

    this.newPerson=newPerson;

    }

    // login方法

    publicvoidaddPerson()throwsIllegalStateException,SecurityException,HeuristicMixedException,

    HeuristicRollbackException,RollbackException,SystemException{

    try{

    //该参数必须与persistence-unit的name相一致

    emf=Persistence.createEntityManagerFactory("PersonUnit");

    em=emf.createEntityManager();

    // 断点测试

    System.out.println("打印输出newPerson:   "+newPerson.toString());

    System.out.println("打印输出em:  "+em.toString());// 测试结果,EntityManager注入失败

    //方法1:

    em.getTransaction().begin();// 至关重要的一步:开启事务

    em.persist(newPerson);

    em.getTransaction().commit();

    }catch(Exceptione){

    e.printStackTrace();

    }finally{

    em.close();

    emf.close();

    //utx.commit();

    System.out.println("存入成功!");

    }

    }

    }

    4.2 详细完整代码

    五、待解决问题

    这段代码中的utx对象是如何实例化的

    @Inject

    private UserTransaction utx;

    1

    2

    @Inject

    privateUserTransactionutx;

    展开全文
  • JPA学习--JPA中的UserTransaction的理解

    千次阅读 2017-05-10 14:04:04
    一、前言今天中午一小伙伴在进行JPA的相关配置时遇到一些疑惑点,...二、UserTransaction简析2.1 代码展示请看下面一段代码:1.注意看javax.transaction.UserTransaction import javax.transaction.UserTransaction;
  • <p>When UserTransaction setting availability (https://github.com/wildfly/wildfly-transaction-client/blob/master/src/main/java/org/wildfly/transaction/client/LocalUserTransaction.java#L79) it requires ...
  • 今天运行AbstractTransactionalJUnit4SpringContextTests的测试...Could not find UserTransaction in JNDI [java:comp/UserTransaction]; 我的测试代码 @ContextConfiguration(locations = {"classpath:applica
  • javax/transaction/UserTransaction

    千次阅读 2009-09-18 01:46:00
    javax/transaction/UserTransaction ejb
  • UserTransaction tx = getUserTransaction(); tx.begin(); ds = (DataSource) ctx.lookup("XAMySqlDS"); conn = ds.getConnection(); //conn.setAutoCommit(false); stmt = ...
  • Quartz javax/transaction/UserTransaction

    千次阅读 2012-07-06 12:36:20
    java.lang.ClassNotFoundException: javax.transaction.UserTransaction 解决办法: 到 http://java.sun.com/products/jta/ 下载 Java Transaction API classes 的zip包,解压然后用命令将jta-1_1-classes...
  • 在运行定时任务的时候报错: Java.lang.NoClassDefFoundError: javax/transaction/UserTransaction 原因:缺少jta的jar包 解决方法:下载并添加jta.jar
  • quartz应用时出现java.lang.NoClassDefFoundError: javax/transaction/UserTransaction   今天在进行quartz应用时,出现了:java.lang.NoClassDefFoundError: javax/transaction/UserTransaction, 错误,上网一...
  • <div><p>rewrote TxTransactionManagerTest to SqlClosureTest. added combination of datasource with and w/o autocommit / TxMan - and fixed one of combination (removed hasTxManager check as i mentioned in...

空空如也

空空如也

1 2 3 4 5 ... 16
收藏数 307
精华内容 122
关键字:

usertransaction