1.事务:一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。
这些组成要么都执行要么都不执行。
> 解释: 把数据库的各种操作封装到一个事务中,这些操作数据库的动作要么都执行要么都不执行。
> 就是把多个要做的操作组合成一个整体,利用事务的特性来保证操作的安全性。如果一个事务做到一半出现任何错误,就会进行回滚操作,来恢复成最初的模样。
2.事务的特点--ACID
原子性(atomicity): 事务是一个原子操作, 由一系列动作组成. 事务的原子性确保动作要么全部完成要么完全不起作用.
一致性(consistency): 一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。举例来说,假设用户A和用户B两者的钱加起来一共是1000,那么不管A和B之间如何转账、转几次账,事务结束后两个用户的钱相加起来应该还得是1000,这就是事务的一致性。
隔离性(isolation): 可能有许多事务会同时处理相同的数据, 因此每个事物都应该与其他事务隔离开来, 防止数据损坏.
持久性(durability): 一旦事务完成, 无论发生什么系统错误, 它的结果都不应该受到影响. 通常情况下, 事务的结果被写到持久化存储器中.
3.事务并发带来的问题:
脏读: 读取了其他事务未提交的数据。
不可重复读: 两次读取的内容不一样。
幻读: 两次读取的数量不一样。
4.解决事务并发带来的问题
① read uncommited(读取未提交内容) :在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。读取未提交的数据,也被称之为脏读(Dirty Read):脏读幻读 不可重复都能发生
② read committed(读取提交内容):这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。可解决脏读,无法解决不可重复和幻读。
③ repeatable read(可重读):这是MySQL的默认事务隔离级别,同一事务的多个实例在并发读取数据时,会看到同样的数据。不过理论上,这会导致另一个棘手的问题:幻读(Phantom Read)。可解决脏读、不可重复读
④ serializable (可串行化) :这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。可解决脏读、不可重复读、幻读。
隔离级别越高---性能越弱。
5.spring实现事务:
**1.事务jar包**
<!--spring事务依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
**2. 修改配置文件**
<!--注入事务切面类 必须为transactionManager-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
</bean>
<!--开启事务注解驱动-->
<tx:annotation-driven/>
**3.使用事务注解**
在需要使用事务的方法上添加 @Transactional 注解,表示该方法需要在事务中执行。例如:
@Transactional public void updateUser(User user) { // 更新用户信息的操作 }
当该方法被调用时,Spring 将会创建一个事务,并在方法执行前开启事务,在方法执行后根据方法的执行结果决定是提交事务还是回滚事务。如果方法执行过程中发生异常,事务将会回滚,否则事务将会提交。
通过以上步骤,我们可以使用注解的方式来管理事务,而无需手动编写事务相关的代码。