1.什么是事务
事务(Transaction),一般指要做的或所做的事情
在计算机术语中是指访问并可能更新数据库中的各种数据项的一个程序执行单元(unit)
程序执行单元(unit)--数据库操作的一组SQL语句的执行
1.由高级数据库操纵语言或编程语言(如:SQL、C++、Java)书写
2.由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成
例如:我们要实现一个银行转账的操作,首先要从A账户减掉金额,然后给B账户增加指定金额,此时转账操作结束。上面的操作如果对应城数据库在操作,那么就需要执行两条update语句。数据库把这两条update语句的执行就是一个事务
事务---指访问并可能更新数据库中各种数据项的一组SQL语句的执行单元(unit)
2. 数据库的事务有4大特征【ACID】
A---原子性(atomicity),一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做
C---一致性(consistency),事务必须是是数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的
I---隔离性(isolation),一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并执行的各个事务之间不能互相干扰
D--持久性(durability),持久性也称永久性,指一个事物一顿提交,他对数据库中的数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
3.Java中事务的隔离级别
在数据库操作中,为了有效保证并发读取数据的正确性,提出的事务隔离级别
JDBC定义了五种书屋隔离级别:
TRANSACTION_READ_UNCOMMITTED 允许脏读、不可重复读或幻读
TRANSACTION_ READ_COMMITTED 禁止脏读,但是允许不可重复读和幻读
TRANSACTION_REPEATABLE-READ 禁止脏读和不可重复读,单运行可以幻读
TRANSACTION_SERIALIZABIE 禁止脏读、不可重复读和幻读
TRANSACTION_NONE JDBC 驱动不支持事务
4. 事务并发性带来的问题
在典型的应用程序中,多个事物并发运行,经常操作相同的数据来完成各自的任务(多个用户对同一数据进行操作)。并发虽然是必须的,但可能会导致以下问题。
1.脏读(Dirty read):当一个事务正在访问数据并且对数据进行了修改,而这种数据还没有提交到数据库时,这时另一个事务也访问了这个数据,并且使用了这个数据,因为这个数据时还没有提交的数据,另一个事务读到的这个数据时"脏数据",依据"脏数据"素偶走的操作可能不是正确的
2.丢失修改(Lost to modify):指在一个事务读取一个数据时,另一个事物也访问了该数据,那么在第一个事务修改了这个数据后,第二个事务也修改了这个数据,再这样一个事务内修改数据就被丢失,因此称为丢失修改,例如:事务1读取表中的数据A=20,事务2页读取A=20,事务1修改A=A-1,事务2也修改A=A-1,最终结果A=19,事务1的修改被丢失了
3.不可重复读(Unrepeatableread):指在一个事务内多次读取同一个数据,在这个事务还没结束时,第二个事务修改了该数据,那么,在第一个数据中两次读取数据之间,由于第二个事物的修改导致第一个事务两次读取的数据不一样的情况,因此称为不可重复读
4.幻读(Phantom read):幻读与不可重复读类似,它发生在第一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时,在随后的查询中,第一个事物(T1)就会发现多一个原本不存的记录,就好像发生幻觉一样,所以称为幻读。
不可重复读和幻读区别:
不可重复读重点在于修改,而幻读终点在于新增或删除
例1(同样的条件,你读取过的数据,再次读取出来发现值不一样):事务1中A先生读取自己的工资为1000的操作还没完成,事务2中的B先生修改了A先生的工资为2000,导致再读自己工资是变为2000,这就是不可重复读
例2(同样的条件,第一次和第二次读取出来的记录数不一样):假某工资单表中工资大于3000的有4人,事务1读取到所有工资大于3000的人,共查到4条记录,这是事务2有插入了一条工资大于3000的人,事务1再次读取时查到的记录变为5条,这样就导致了幻读
5.JDBC的事务管理操作
JDBC的事务管理操作需要通过java.sql.Connection接口来设置的
1.事务隔离级别:
static int |
TRANSACTION_READ_COMMITTED 一个常数表示防止脏读; 可能会发生不可重复的读取和幻像读取。 |
static int |
TRANSACTION_READ_UNCOMMITTED 一个常量表示可能会发生脏读,不可重复读和幻读。 |
static int |
TRANSACTION_REPEATABLE_READ 一个常量表示防止了脏读和不可重复读; 可以发生幻读。 |
static int |
TRANSACTION_SERIALIZABLE 一个常数表示防止脏读,不可重复读和幻影读。 |
Modifier and Type |
Constant Field |
Value |
public static final int |
0 |
|
public static final int |
2 |
|
public static final int |
1 |
|
public static final int |