事务

1、首先什么是事务?

事务(Transaction)是并发控制单位,是用户定义的一个操作序列,这些操作要么都做,要么都不做,是一个不可分割的工作单位。

事务通常以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK结束。

2、事务的 ACID又是什么?

事务中的所有操作要么全部执行,要么都不执行; 如果事务没有原子性的保证,那么在发生系统 故障的情况下,数据库就有可能处于不一致状态。 因而,事务的原子性与一致性是密切相关的。

如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性

⑴ 原子性(Atomicity)
  原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

⑵ 一致性(Consistency)
  一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。

⑶ 隔离性(Isolation)

隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。

关于事务的隔离性数据库提供了多种隔离级别,稍后会介绍到。

⑷ 持久性(Durability)

持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

3、MySQL数据库为我们提供的四种隔离级别:

① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
  ② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
  ③ Read committed (读已提交):可避免脏读的发生。
  ④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。

4、Spring实现事务主要有两种方式

编程式事务处理:所谓编程式事务指的是通过编码方式实现事务,允许用户在代码中精确定义事务的边界。即类似于JDBC编程实现事务管理。管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。

声明式事务处理:管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中。

5、编程式事务实现
package com.thit.serviceImpl;

import java.util.Date;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.HibernateTransactionManager;
import org.springframework.stereotype.Service;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;

import com.thit.dao.OrderDao;
import com.thit.dao.ProductDao;
import com.thit.entity.Order;
import com.thit.entity.Product;
import com.thit.service.OrderService;
@Service(value=“orderServiceimpl111”)
public class OrderServiceImpl implements OrderService {
@Autowired
private OrderDao orderDao;
@Autowired
private ProductDao productDao;
@Autowired
private PlatformTransactionManager transactionManager;
@Autowired
private TransactionDefinition transactionDefinition;

//private HibernateTransactionManager hibernateTransactionManager;
public void addOrder(Order order) {
	// TODO Auto-generated method stub
	//订单表
	order.setCreateTime(new Date());
    order.setStatus("待付款");
    TransactionStatus  status=null;
    //开启事务
    try {
    	TransactionStatus status=transactionManager.getTransaction(transactionDefinition);
    	//插入一条订单数据并且根据订单数据的下单数在商品表库存相对减少
 		orderDao.insert(order);
 		Product p=productDao.select(order.getProductsId());
 		p.setStock(p.getStock()-order.getNumber());
 		productDao.update(p);
 		//提交事务
 		transactionManager.commit(status);
	} catch (Exception e) {
		// TODO: handle exception
		transactionManager.rollback(status);
		e.printStackTrace();
	}
   
}

}

6、声明式事务实现

public class OrderServiceImpl3 implements OrderService {
@Autowired
private OrderDao orderDao;
@Autowired
private ProductDao productDao;
//声明式事务代码简洁 第一种当时基于拦截器
public void addOrder( Order order) {
// TODO Auto-generated method stub
// 订单表
System.out.println(“进入”);
order.setCreateTime(new Date());
order.setStatus(“待付款测试2”);
List list=orderDao.select();
System.out.println(list.size());
orderDao.insert(order);
// 商品
Product p = productDao.select(order.getProductsId());
p.setStock(p.getStock() - order.getNumber());
productDao.update§;

}

}

7、基于注解实现声明式事务

package com.thit.servicImpl;

import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.thit.dao.OrderDao;
import com.thit.dao.ProductDao;
import com.thit.entity.Order;
import com.thit.entity.Product;
import com.thit.service.OrderService;

@Service(value=“OrderServiceImpl6”)
public class OrderServiceImpl6 implements OrderService {
@Autowired
private OrderDao orderDao;
@Autowired
private ProductDao productDao;
//设置事务传播性和隔离级别
@Transactional(propagation=Propagation.REQUIRED,readOnly=false,isolation=Isolation.REPEATABLE_READ)
public void addOrder( Order order) {
// TODO Auto-generated method stub
// 订单表
System.out.println(“进入”);
order.setCreateTime(new Date());
order.setStatus(“待付款测试2”);
List list=orderDao.select();
System.out.println(list.size());
orderDao.insert(order);
// 商品
Product p = productDao.select(order.getProductsId());
p.setStock(p.getStock() - order.getNumber());
productDao.update§;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值