事务
事务:
司机版:没有感觉
王栋:数据库中的概念。提交事务 。。
帅帅:在某一个阶段出现问题,整个事务回滚。撤销所有影响。
王哲言:没有好好学
事务:同生共死,一个整体。
星星:四种隔离级别 提交和回滚
冯如岩:事务有ACID原则
原子性
一致性
隔离性
持久性
家有儿女:导演:英达
艺术源于生活,远远高于生活
事务源于基础 ,远远高于之前的理解
如何用真实的程序代码去体现事务的优点
区别
1.购买股票
账户
股票
事务:
司机版:没有感觉
王栋:数据库中的概念。提交事务 。。
帅帅:在某一个阶段出现问题,整个事务回滚。撤销所有影响。
王哲言:没有好好学
事务:同生共死,一个整体。
星星:四种隔离级别 提交和回滚
冯如岩:事务有ACID原则
原子性
一致性
隔离性
持久性
家有儿女:导演:英达
艺术源于生活,远远高于生活
事务源于基础 ,远远高于之前的理解
如何用真实的程序代码去体现事务的优点
区别
1.购买股票
账户
股票
Service 调度底层dao
2个dao
Exception
Throwable
Spring 默认对 运行时异常 事务处理 自动回滚
事务代理工厂Bean
TransactionProxyFactoryBean
Properties
事务:
数据库四种隔离级别
1.读未提交 Read_Uncommitted
2.读已经提交 Read_committed
3.可重复读 Repeatable_read
4.串行化 Serializable
七种传播行为
PROPAGATION_REQUIRED
PROPAGATION_REQUIRED
作业:
1.事务讲解调试通过。形成博客
2.脏读,不可重复读,幻象读 丢失更新(乐观锁,悲观锁)
3.Spring+Mybatis整合预习
DAO层
package cn.bdqn.Bookshoop.dao;
/**
* Created by Administrator on 2017/8/4.
*/
public interface AcoountDao {
public boolean Acoountone(int aid ,double money,boolean isBuy );
}
package cn.bdqn.Bookshoop.dao;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
/**
* Created by Administrator on 2017/8/4.
*/
public class AcoountDaoImpl extends JdbcDaoSupport implements AcoountDao {
public boolean Acoountone(int aid, double money, boolean isBuy) {
boolean fat=false;
String sql=null;
if(isBuy){
sql="update account set balance=balance-? where aid=?";
}else{
sql="update account set balance=balance+? where aid=?";
}
int update = this.getJdbcTemplate().update(sql, money, aid);
if (update>0){
fat=true;
}
return fat;
}
}
package cn.bdqn.Bookshoop.dao;
/**
* Created by Administrator on 2017/8/4.
*/
public interface Stock {
public boolean Stocktone(int sid ,int count, boolean isBuy );
}
package cn.bdqn.Bookshoop.dao;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
/**
* Created by Administrator on 2017/8/4.
*/
public class StockImpl extends JdbcDaoSupport implements Stock {
public boolean Stocktone(int sid, int count, boolean isBuy) {
boolean fat=false;
String sql=null;
if(isBuy){
sql="update stock set balance=balance+? where aid=?";
}else{
sql="update stock set balance=balance-? where aid=?";
}
int update = this.getJdbcTemplate().update(sql, count, sid);
if (update>0){
fat=true;
}
return fat;
}
}
DAO层的方法
ENTITY层
package cn.bdqn.Bookshoop.entity;
/**
* Created by Administrator on 2017/8/4.
*/
public class Account {
public Integer getAid() {
return aid;
}
public void setAid(Integer aid) {
this.aid = aid;
}
public String getAname() {
return aname;
}
public void setAname(String aname) {
this.aname = aname;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
private Integer aid;
private String aname;
private double balance;
}
package cn.bdqn.Bookshoop.entity;
/**
* Created by Administrator on 2017/8/4.
*/
public class Stock {
private Integer sid; //股票账户编号
private Integer count; //持有股数
private String sname;//股票名称
public Integer getSid() {
return sid;
}
public void setSid(Integer sid) {
this.sid = sid;
}
public Integer getCount() {
return count;
}
public void setCount(Integer count) {
this.count = count;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
}
package cn.bdqn.Bookshoop.entity;
/**
* Created by Administrator on 2017/8/4.
*/
public class StokException extends Exception {
public StokException() {
}
public StokException(String message) {
super(message);
}
}
SERVICE里组合代码 把两个DAO层方法放在一个方法
package cn.bdqn.Bookshoop.Service;
import cn.bdqn.Bookshoop.entity.StokException;
/**
* Created by Administrator on 2017/8/4.
*/
public interface AcoountService {
public void Acoountone(int aid, double money , int countq,int sid ) throws Exception;
}
package cn.bdqn.Bookshoop.Service;
import cn.bdqn.Bookshoop.entity.StokException;
import cn.bdqn.Bookshoop.dao.AcoountDao;
import cn.bdqn.Bookshoop.dao.Stock;
/**
* Created by Administrator on 2017/8/4.
*/
public class AcoountServiceImpl implements AcoountService {
private AcoountDao adao;
private Stock sdao;
public void Acoountone(int aid, double money , int count,int sid ) throws Exception {
boolean isBuy=true;
//z植入AcountDao
adao.Acoountone(aid,money,isBuy);
//异常拦截归滚 下面代码不执行
if (1==1) {
throw new StokException();
}
sdao.Stocktone(sid,count,isBuy);
}
public Stock getSdao() {
return sdao;
}
public void setSdao(Stock sdao) {
this.sdao = sdao;
}
public AcoountDao getAdao() {
return adao;
}
public void setAdao(AcoountDao adao) {
this.adao = adao;
}
}
主要的 resources下面的XML;
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
">
<!--00.识别jbdc。propertties文件-->
<context:property-placeholder location="jdbc.properties"></context:property-placeholder>
<!-- 01.建立数据库 ${}Spring n内设的一个数据 DriverManger–>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>-->
<!--<!–02.阿里巴巴的–>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>-->
<!-- <!–03.c3p0 com.mchange.v2.c3p0.ComboPooledDataSource–>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="dataSourceName" value="${jdbc.driverClassName}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>-->
<!--04.dbcp-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!--02.jdbcTemplate 配置-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--03.dao配置-->
<bean id="adao" class="cn.bdqn.Bookshoop.dao.AcoountDaoImpl">
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>
<!--03.dao配置-->
<bean id="sdao" class="cn.bdqn.Bookshoop.dao.StockImpl">
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>
<!--04.service bookService-->
<bean id="acoountService" class="cn.bdqn.Bookshoop.Service.AcoountServiceImpl">
<property name="adao" ref="adao"></property>
<property name="sdao" ref="sdao"></property>
</bean>
<!--事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--配置事务。拦截业务方法-->
<bean id="acoountServiceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<!--目标-->
<property name="target" ref="acoountService"></property>
<property name="transactionManager" ref="transactionManager"></property>
<!--增强-->
<property name="transactionAttributes">
<props>
<prop
//这个别写错 !ISOLATION_DEFAULT,PROPAGATION_REQUIRED,-StokException 它是异常方法名字
key="Acoountone">ISOLATION_DEFAULT,PROPAGATION_REQUIRED,-StokException</prop>
</props>
</property>
</bean>
</beans>
让后在测试类
package cn.bdqn.tset;
import cn.bdqn.Bookshoop.Service.AcoountService;
import cn.bdqn.Bookshoop.Service.AcoountServiceImpl;
import cn.bdqn.spring0730dai.intterceotorNames.some;
import cn.bdqn.spring19jdbctemplate.dao.impl.BookDAOImpl;
import cn.bdqn.spring19jdbctemplate.service.IBookService;
import cn.bdqn.springaop0731.UserName;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* Created by Administrator on 2017/7/23.
*/
public class SpringTset0804 {
@Test
public void set(){
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContextJdbcBookshoop.xml");
AcoountService service = (AcoountService) ctx.getBean("acoountServiceProxy");
try {
service.Acoountone(2,200,300,1);
} catch (Exception e) {
e.printStackTrace();
}
}
}