Prefácio
O endereço de download do código de exemplo deste artigo (executado completamente, incluindo arquivos SQL, modifique a configuração do banco de dados após o download): Clique aqui para baixar
Várias operações de banco de dados são controladas como um todo e conseguem ou falham juntas.
Atomicidade: refere -se a uma transação sendo uma unidade de trabalho inseparável, e operações em uma transação ocorrem ou nenhuma ocorra.
Consistência: significa que a integridade dos dados antes e após uma transação deve ser consistente.
Isolamento: quando vários usuários acessam o banco de dados simultaneamente, as transações de um usuário não podem ser interferidas pelas transações de outros usuários, e os dados entre várias transações simultâneos devem ser isolados um do outro.
Persistência: Uma vez que uma transação seja cometida, suas alterações nos dados no banco de dados são permanentes e a falha do banco de dados instantânea não deve ter nenhum impacto nele.
--Platform TransactionManager Transaction Manager (Commit, Rollback Transactions)
A Spring fornece diferentes implementações de interface de transação de plataforma para diferentes estruturas de persistência. como:
Usando DataSourCetransactionManager ao persistir dados usando o Spring JDBC ou IBATIS
Use HibernateTransactionManager ao usar o Hibernate3.0 para obter dados persistentes
-Informações de definição da transação da Transação de Definição (isolamento, propagação, tempo limite, somente leitura)
Leitura suja: Uma transação lê dados que foram reescritos por outra transação, mas ainda não foram enviados. Se esses dados forem revertidos, os dados de leitura serão inválidos.
Sem leitura repetitiva: Na mesma transação, os resultados retornados lendo os mesmos dados várias vezes são diferentes.
Leitura de fantasia: Após uma transação, lê várias linhas de discos, outra transação insere alguns registros e a leitura de fantasia ocorre. Na consulta posterior, a primeira transação encontrará alguns registros que não estavam originalmente disponíveis.
Nível de isolamento da transação: (cinco tipos)
Entre eles, o MySQL usa o nível de isolamento repetido_read por padrão; O Oracle usa o nível de isolamento read_commited por padrão
Comportamento de comunicação da transação: (sete tipos)
-TransactionStatus Transação Status de operação específica
um. Gerenciamento de transações de programação (com base no controle de programação Java, raramente usado)-consulte o pacote Demo1
Use TransactionTemplate para encapsular várias operações DAO
*b. Gerenciamento de transações declarativas (controle de configuração AOP baseado na mola)
- Baseado no transactionProxyFactoryBean. (Raramente usado)-Veja o pacote Demo2
É necessário configurar uma transaçãoProxyFactictoryBean para cada classe que está passando por um gerenciamento de transações para aprimoramento.
-Based na configuração XML (usada com frequência)-Veja o pacote Demo3
Uma vez configurado, nada precisa ser adicionado à classe.
Se a ação é um objeto de destino para inserir a transação, você precisará adicionar o atributo proxy-alget-class = "true" ao elemento <aOP: config>. O motivo é informar a estrutura da primavera para usar a tecnologia CGLIB para gerar classes de ação com funções de gerenciamento de transações.
-Dased em anotações (configuração simples, frequentemente usada) -See Pacote Demo4
Ativar configuração da anotação de transações no ApplicationContext.xml. (Em ApplicationContext.xml, basta definir o feijão e anexar os seguintes elementos)
<bean id = "txManager"> <propriedade name = "sessionFactory"> </property> <tx: transação orientada por anotação-manager = "txManager"/>
Use @Transactional na classe de componentes de destino, que pode ser definida antes da classe ou antes do método.
--Programação
/ *** @Description: Interface da camada DAO do caso de transferência**/ public Interface AccountDao {/ *** @param out*: transferência de conta* @param dinheiro*: Valor de transferência*/ public void outmoney (string out, dinheiro duplo); / ** * * @param in *: transfira conta * @param dinheiro *: Valor da transferência */ public void InMoney (String in, Double Money); } / *** @Description: A classe de implementação da camada DAO do caso de transferência*/ public class AccountDaoImpl estende JDBCDAOSUPPPORT implementa AccountDao {/ *** @param out*: transferir conta* em dinheiro @Param Money*: SQUM STRATURA*/ @Overide public void outMoney (String Out,? this.getjdbctemplate (). update (sql, dinheiro, out); } / *** @param in*: transfira conta* @param dinheiro*: Valor de transferência* / @Override public void InMoney (String in, Double Money) {String sql = "Atualizar conta definir dinheiro = dinheiro+? Onde o nome =?"; this.getjdbctemplate (). update (sql, dinheiro, in); }} / *** @Description: Interface comercial do caso de transferência**/ Public Interface AccountService {/ *** @Param Out: Transfira* @param em: transferir conta* @param Money: Transfer Mump*/ public void transfer (string out, string in, dinheiro duplo); } / *** @Description: Classe de implementação da camada de negócios do caso de transferência*/ classe pública AccountServiceImpl implementa o serviço de conta {// dao private AccountDao AccountDao; // modelo para injetar gerenciamento de transações privado transactionTemplate transactionTemplate; / ** * @param out *: transfira * @param in *: transfira conta * @param dinheiro *: Valor de transferência */ @Override Public Void Transfer (string final out, string final em, dinheiro duplo final) {// Se ocorrer uma exceção durante o processo, a operação anterior poderá ser concluída. Se o último não puder, a transferência será bem -sucedida, mas a transferência não será recebida. // AccountDao.outMoney (Out, Money); // int i = 1/0; // AccountDao.inmoney (in, dinheiro); transactionTemplate.execute (new TransactionCallbackwithoutResult () {@Override Protected void dointransactionwithoutResult (transactionStatus transactionStatus) {AccountDao.outMoney (OUT, Money); // Int I = 1/0; AccountDao.inmoney (in, dinheiro); } public void setAccountDao (AccountDao AccountDao) {this.accountDao = accountDao; } public void setTransactionTemplate (transactionTemplate transactionTemplate) {this.TransactionTemplate = transactionTemplate; }}ApplicationContext1.xml
<!-Introduzir arquivos de propriedade externa-> <Contexto: Property-Placter Location = "ClassPath: JDBC.Properties" /> <!-Configurar pool de conexão C3P0-> <bean id = "DataSource"> <propriedades name = "Driver" "JDBC.Riverclass"> <Nome da propriedade = "Nome =" JDBC.Riverclass " /" /> <nome da propriedade = "Jdbc.riverclass" / value = "$ {jdbc.url}" /> <propriedade name = "user" value = "$ {jdbc.username}" /> <propriedade name = "senha" value = "$ {jdbc.password}" /> < /bean> <!-configure a camada comercial " /> <!-Injete o modelo para gerenciamento de transações-> <propriedade name = "transactionTemplate" ref = "transactionTemplate" /> </i bean> <!-Configure a classe Dao (simplificada, JDBCTemplate será configurado automaticamente)-> <Bean = "DatraDa"> <propriedades = "DataSurce")-> <roucTaMa-! Classe dao (não simplificada)-> <!-<bean id = "jdbctemplate"> <propriedade name = "DataSource" ref = "DataSource" /> < /bean> <bean id = "accountDao"> <Nome da propriedade "JDBCTemplate" Ref = "Jdbctemplate"> < /beirbon =============================================================================================================== ======================================================= doc ======================================================= doc ======================================================= doc Configurar modelo de gerenciamento de transações: classes fornecidas pela primavera para simplificar o código de gerenciamento de transações -> <bean id = "transactionTemplate"> <propriedade name = "transactionManager" ref = "transactionManager"/> </shean>teste:
@Runwith (springjunit4classrunner.class) @ContextConfiguration ("ClassPath: ApplicationContext1.xml") public class TransactionTest {@Resource (name = "AccountService") PrivateCountService Service; @Test public void Demo1 () {AccountService.Transfer ("AAA", "BBB", 200D); }}-um método baseado na transaçãoproxyfactorybean
classe pública AccountServiceImpl implementa o serviço de conta {// dao private AccountDao AccountDao; / ** * @param out *: transfira * @param em *: transfira conta * @param dinheiro *: Valor de transferência */ @Override public void Transfer (string out, string in, Double Money) {AccountDao.outMoney (Out, Money); // int i = 1/0; AccountDao.inmoney (em, dinheiro); } public void setAccountDao (AccountDao AccountDao) {this.accountDao = accountDao; }}ApplicationContext2.xml
<!-Introduzir arquivos de propriedade externa-> <Contexto: Property-Placter Location = "ClassPath: JDBC.Properties" /> <!-Configurar pool de conexão C3P0-> <bean id = "DataSource"> <propriedades name = "Driver" "JDBC.Riverclass"> <Nome da propriedade = "Nome =" JDBC.Riverclass " /" /> <nome da propriedade = "Jdbc.riverclass" / value = "$ {jdbc.url}" /> <propriedade name = "user" value = "$ {jdbc.username}" /> <propriedade name = "senha" value = "$ {jdbc.password}" /> < /bean> <!-configure a camada comercial " /> </ Bean> <!-Configure a classe Dao (simplificada, configure automaticamente JDBCTemplate)-> <bean id = "AccountDao"> <propriedades name = "DataSource" ref = "DataSource" /> </ Bean> <!- =============================================================================================================================== ================================================================================================== =============================================================================================================================== ================================================================================================== -> <!-Configurar Gerenciador de transações-> <bean id = "transactionManager"> <propriedade name = "DataSource" ref = "DataSource" /> </ Bean> <!-Configure o proxy para a camada de negócios-> <bean id = "contabilizeProxy"> <!-configre o objeto-> --> <property name="transactionManager" ref="transactionManager"></property> <!-- Inject transaction properties --> <property name="transactionAttributes"> <props> <!-- Format of prop: * PROPAGATION: Transaction propagation behavior* ISOTATION: Transaction isolation level* readOnly: Read-only* -EXCEPTION: Which exceptions roll back transactions* +EXCEPTION: Which exceptions do not roll back transações-> <prop key = "transfer"> propagation_required </pp> <!-<p key = "transfer"> propagation_required, readonly </pp>-> <!-<p key = "transfer"> propagation_required, readonly </socility) <!-<pke)> propagation_required, readonly </sprwer) <!-<! -> </sports> </propriedade> </i bean>teste:
@Runwith (springjunit4classrunner.class) @ContextConfiguration ("ClassPath: ApplicationContext2.xml") public class TransactionTest { / *** Certifique -se de injetar a classe proxy: porque a classe proxy executa operações aprimoradas* / // @Resource (Name = "" AccountService AccountService; @Test public void Demo1 () {AccountService.Transfer ("AAA", "BBB", 200D); }}-baseado na configuração XML
classe pública AccountServiceImpl implementa o serviço de conta {// dao private AccountDao AccountDao; / ** * @param out *: transfira * @param em *: transfira conta * @param dinheiro *: Valor de transferência */ @Override public void Transfer (string out, string in, Double Money) {AccountDao.outMoney (Out, Money); // int i = 1/0; AccountDao.inmoney (em, dinheiro); } public void setAccountDao (AccountDao AccountDao) {this.accountDao = accountDao; }}ApplicationContext3.xml
<!-Introduzir arquivos de propriedade externa-> <Contexto: Property-Placter Location = "ClassPath: JDBC.Properties" /> <!-Configurar pool de conexão C3P0-> <bean id = "DataSource"> <propriedades name = "Driver" "JDBC.Riverclass"> <Nome da propriedade = "Nome =" JDBC.Riverclass " /" /> <nome da propriedade = "Jdbc.riverclass" / value = "$ {jdbc.url}" /> <propriedade name = "user" value = "$ {jdbc.username}" /> <propriedade name = "senha" value = "$ {jdbc.password}" /> < /bean> <!-configure a camada comercial " /> </ Bean> <!-Configure a classe Dao (simplificada, configure automaticamente JDBCTemplate)-> <bean id = "AccountDao"> <propriedades name = "DataSource" ref = "DataSource" /> </ Bean> <!- ================================================================= ================================================================== ================================================================== ================================================================== ================================================================== ================================================================== ================================================================== ================================================================== : Isolamento do comportamento da propagação da transação: Nível de isolamento da transação somente leitura: reversão somente leitura para: que exceções ocorreram sem rollback para: quais exceções ocorreram não tempo limite: informações de expiração-> <tx: name: "transferência" propagação = "requerir"/> </tx: atributes> <-tx: conselhos> Point-> <AOP: Pointcut Expression = "Execution (* com.zs.spring.demo3.AccountService+.* (..))" ID = "Pointcut1"/> <!-Seção de Configuração-> <AOP: ADUSTOR ADOSTO-REF = "Txadvice" Point-ref = "Pointcut1" "/>teste:
/ *** @Description: Método de gerenciamento de transações declarativas da primavera Dois: Configuração XML baseada em aspecto*/ @runwith (springjunit4classrunner.class) @ContextConfiguration ("ClassPath: ApplicationContext3.xml") Classe publicTesty {/ *** deve no desempenho do proxy "ContaService")) SERVICE PRIVADO SERVIÇO; @Test public void Demo1 () {AccountService.Transfer ("AAA", "BBB", 200D); }}-baseado na anotação
/ *** @Transaction Propagation: Transação Propagação Comportamento Isolamento: Transação Nível de isolamento Readelly: somente leitura* RollbackFor: que exceções ocorreram norollbackFor: que exceções ocorreram não rollback* rollbackling.Name Rollback de acordo com a classe Exception*/ @Transaction (propagação = propagação Classe AccountServiceImpl implementa o serviço de conta {// dao injeção de transferência de conta privada da conta; / *** @param out*: Conta de transferência* @param in*: transfira conta* @param dinheiro*: Valor de transferência*/ @Override public void Transfer (String out, string in, Double Money) {AccountDao.outMoney (Out, Money); // int i = 1/0; AccountDao.inmoney (em, dinheiro); } public void setAccountDao (AccountDao AccountDao) {this.accountDao = accountDao; }}ApplicationContext4.xml
<!-Introduzir arquivos de propriedade externa-> <Contexto: Property-Placter Location = "ClassPath: JDBC.Properties" /> <!-Configurar pool de conexão C3P0-> <bean id = "DataSource"> <propriedades name = "Driver" "JDBC.Riverclass"> <Nome da propriedade = "Nome =" JDBC.Riverclass " /" /> <nome da propriedade = "Jdbc.riverclass" / value = "$ {jdbc.url}" /> <propriedade name = "user" value = "$ {jdbc.username}" /> <propriedade name = "senha" value = "$ {jdbc.password}" /> < /bean> <!-configure a camada comercial " /> </ Bean> <!-Configure a classe Dao (simplificada, configure automaticamente JDBCTemplate)-> <bean id = "AccountDao"> <propriedades name = "DataSource" ref = "DataSource" /> </ Bean> <!- =============================================================================================================================== ================================================================================================== =============================================================================================================================== ================================================================================================== Configurar Gerenciador de transações-> <bean id = "transactionManager"> <propriedade name = "DataSource" ref = "DataSource"/> </bean> <!-Ligue a transação de anotação-> <tx: transação orientada por anotação-manager = "transação"/>teste:
@Runwith (springjunit4classrunner.class) @ContextConfiguration ("ClassPath: ApplicationContext4.xml") Classe public transactionTest { / *** Certifique -se de injetar a classe proxy: porque a classe Proxy executa operações aprimoradas* / @Resource (Name = ""; @Test public void Demo1 () {AccountService.Transfer ("AAA", "BBB", 200D); }}Para código específico de código e arquivo de referência de arquivo de banco de dados, código completo:
http://xiazai.vevb.com/201805/yuanma/spring-transaction_jb51.rar
Resumir
O acima é o conteúdo inteiro deste artigo. Espero que o conteúdo deste artigo tenha certo valor de referência para o estudo ou trabalho de todos. Se você tiver alguma dúvida, pode deixar uma mensagem para se comunicar. Obrigado pelo seu apoio ao wulin.com.