在一個業務的實現過程中,可能需要多條sql完成對數據庫的操作,比如賬戶登錄,需要匹配用戶名和密碼,然后要增加積分,還要記錄登錄的ip和時間,這可能需要三個sql語句,這三個語句應當是一個整體,任意一個sql執行不成功,都表示這個業務沒有執行完成,這就有了事務的概念。
事務是數據庫中的概念,就是對數據庫的一組操作,由一條或多條sql組成。
事務具有同步的特點,一條sql執行失敗,其他sql都不會執行,即要么都執行,要么都不執行。
用START TRANSACTION
開啟一個事務,這之后執行的sql語句,在用COMMIT
提交事務之前,都沒有被"寫死"到數據庫中,可以用ROLLBACK
進行回滾操作。
Spring在jdbc中提供了一個事務管理組件:org.springframework.jdbc.datasource.DataSourceTransactionManager
<!-- 配置事務管理組件 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dbcp"> <!-- dbcp是連接池組件(org.apache.commons.dbcp2.BasicDataSource)的bean -->
</bean>
使用事務管理的功能,跟創建bean一樣,可以采用注解和xml配置兩種方式。當然可能還有別的方式,還沒學到
<!-- 采用注解方式:有源碼的情況下,將注解加在方法上 -->
<!-- 開啟事務注解標記@Transactional,當調用帶@Transactional標記的方法時,將txManager的事務管理功能切入進去 -->
<tx:annotation-driven transactional-manager="txManager" />
<!-- 在需要事務管理的方法上加上@Transactional注解即可 -->
<!-- 采用xml配置的方式:使用別人寫好的功能,沒有源碼,就可以用xml配置 -->
<tx:advice id="txAdvice" transaction-manager="txManager" > <!-- 仍然使用txManager作為事務管理組件 -->
<tx:attributes>
<tx:method name="updateTitleAndBody" /> <!-- 在哪些方法上添加事務管理 -->
<tx:method name="register" /> <!-- 這里寫方法名 -->
<tx:method name="checkLogin" /> <!-- 支持通配符 -->
<tx:method name="listNotebook" />
<tx:method name="getDeletedNotes" />
</tx:attributes>
</tx:advice>
<!-- 通過aop機制完成事務管理 -->
<aop:config>
<!-- 作用在哪些組件上 -->
<aop:pointcut id="target" expression="within(net.sonng.note.service.UserServiceImpl)" />
<!-- 這個expression的寫法有講究 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="target"/>
</aop:config>
其他:MyBatis應該也提供了事務管理的組件