Problemas com o merge do Hibernate

Olá, eu estou fazendo a parte de banco de dados no meu sistema (um programa de frente de caixa), e ao iniciar o programa ele instancia as Threads responsáveis por buscar os produtos, clientes, etc. na retaguarda via xml, e baixa todos para o banco, e quando um item é alterado, ou se uma empresa muda, algo do tipo, ele deveria mudar também, uma baixa de estoque ou alteração de um preço por exemplo… Até a parte de carregar os dados no banco eu consegui, mas na hora de dar o merge pra poder dar o update caso algo mude eu estou tendo este erro Transaction not successfully started, Alguém saberia me explicar o porque isto esta acontecendo? e como eu poderia contornar esse erro… segue meu código abaixo →

private void atualizaEmpresa(Element empresaElementList) {
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("fca");
		EntityManager em = emf.createEntityManager();
		try {
			Empresa empresa = null;
			List<Element> listaEmpresa = empresaElementList.getChildren("Empresa");
			
			int i = 0;
			for (Element elementPac : listaEmpresa) {
				i++;
				barraDeProgresso.setString(
						(i == listaEmpresa.size()) ? "Concluido" : "Carregando Empresas "+i+" de "+listaEmpresa.size());
					if (empresa == null) {
						empresa = new Empresa();
						empresa.setEmpCod(1);
						}
					empresa.setBairro(elementPac.getChildText("EmpresaBairro"));
					empresa.setCep(elementPac.getChildText("EmpresaCep"));
					empresa.setChave(elementPac.getChildText("EmpresaChave"));
					empresa.setCnpj(elementPac.getChildText("EmpresaCnpj"));
					empresa.setEndereco(elementPac.getChildText("EmpresaEndereco"));
					empresa.setInscEstadual(elementPac.getChildText("EmpresaInscEstadual"));
					empresa.setInscMunicipal(elementPac.getChildText("EmpresaInscMunicipal"));
					empresa.setMunCod(Integer.parseInt(elementPac.getChildText("EmpresaMunicipio")));
					empresa.setNomeFantasia(elementPac.getChildText("EmpresaNomeFantasia"));
					empresa.setNumero(Integer.parseInt(elementPac.getChildText("EmpresaNumero")));
					empresa.setRazaoSocial(elementPac.getChildText("EmpresaRazaoSocial"));
					empresa.setEmpCodRetaguarda(Integer.parseInt(elementPac.getChildText("EmpCodRetaguarda")));

					em.getTransaction().begin();
					try {
						em.persist(empresa);
						em.getTransaction().commit();
					} catch (RollbackException e) {
						em.find(empresa.getClass(), Integer.parseInt(elementPac.getChildText("EmpCodRetaguarda")));
						em.merge(empresa);
						em.getTransaction().commit();
					}
				}
			} catch (DAOException e) {
	
			}finally {			
				em.close();
				emf.close();
				emf = null;
				em = null;
			}
	}

Desde já agradeço a atenção!