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