数据库事务
数据库事务( transaction)是访问,并可能操作各种数据项的,一个数据库操作序列,这些操作要么,全部执行,要么,全部不执行,是一个不可分割的,工作单位。事务由事务开始,与事务结束之间执行的,全部数据库操作组成。
比如,我们去银行转账,操作可以分为下面两个环节:
(1)从第一个账户划出款项。
(2)将款项存入第二个账户
在这个过程中,两个环节是关联的。第一个账户划出款项必须保证正确的存入第二个账户,如果第二个环节没有完成,整个的过程都应该取消,也就是说,第一个账户转出去的钱要回到第一个人的账户中,称为数据回滚,否则就会发生丢失款项的问题。整个交易过程,可以看作是一个事物,成功则全部成功,失败则需要全部撤消,这样可以避免当操作的中间环节出现问题时,产生数据不一致的问题。
jdbc事务
- 数据一旦提交,就不能再回滚。
- 数据什么时候意味着提交?
- 当对象被创建时,默认情况自动提交事务:每次执行一个 SQL 语句,如果执行成功,就会向数据库自动提交,而不能回滚。
- 关闭数据库连接,数据自动的提交。如果是多个操作,每个操作使用的是自己单独的连接,则无法保证事务。即同一个事务的多个操作必须在同一个连接下。
- jdbc中为了可以让多条数据作为一个事务同时提交,我们三个方法必须要知道
方法名 | 描述 |
---|---|
setAutoCommit(false) | 取消自动提交事务 |
commit() | 提交事务 |
rollback() | 回滚事务 |
事务的ACID
1.原子性(Atomicity) 操作要么都发生,要么都不发生。
过程:
1、小明:1000-200=800
2、小红:1000+200=1200
原子性表示:不能小明转账了小红没收到,或者小红账上多了200,而小明账上没减少,二者是同时发生的。
2.一致性(Consistency) 事务前后数据完整性保持一致
一致性体现:
1、操作前:小明:1000 小红:1000
2、操作后:小明:800 小红:1200
也就是说这两人操作前后,两个人钱的总数相加都是2000
3.隔离性(Isolation) 事务的隔离性是指一个事务的执行不能被其他事务干扰。就像是两个人走路,你走你的,我走我的,当然了像男女朋友走路手拉着手就刚好是反例,恰恰是两个事务没有隔离
隔离性体现
事务1:操作前:A:200 B:100
操作后 A:100 B:200
事务2:操作前:C:300 D:400
操作后:C:500 D:200
4.持久性(Durability) 持久性是指一个事务一旦被提交,它对数据库中数据的改变,就是永久性的,接下来的其他操作不对之前的操作造成影响。
数据库的并发
脏读 :脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这个修改还没有提交到数据库中,这时,另外一个事务也访问 这个数据,然后还使用了这个数据。
不可重复读 :是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两 次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,所以称为是不
可重复读幻读 : 是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。 同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象
发生了幻觉一样。
数据库的四种隔离级别
隔离级别 | 脏读 | 不可重复 | 幻读 |
---|---|---|---|
读未提交(read-uncommitted) | 是 | 是 | 是 |
不可重复读(read-committed) | 否 | 是 | 是 |
可重复读(repeatable-read) | 否 | 否 | 是 |
串行化(serializable) | 否 | 否 | 否 |
Oracle 支持的 2 种事务隔离级别:read-committed, serializable。
Oracle 默认的事务隔离级别为: read-committed(不可重复读) 。Mysql 支持 4 种事务隔离级别。
Mysql 默认的事务隔离级别为: repeatable-read(可重复读)为什么数据库的隔离级别默认是可重复读?
1.主从复制,是基于什么复制的?
是基于binlog复制的
2.binlog有几种格式?
statement:记录的是修改SQL语句
row:记录的是每行实际数据的变更
mixed:statement和row模式的混合