事务
1、事务的四大特性(ACID)
①原子性(Atomicity)事务中所有操作都是不可分割的原子单位,要么所有操作全部执行成功,要么全部失败。
②一致性(Consistency)事务执行后,数据库状态与其他业务规则保持一致,如转账业务,无论成功与否,参与转账的两个账号的余额之和应该是不变的。
③隔离性(Isolation)隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰。
④持久性(Durability)一旦事务提交成功,事务中所有的数据操作都必须持久化到数据库中,及时在事务提交后,数据库马上崩溃,在数据库重启时,也必须保证能通过某种机制恢复数据。
2、MySql中的事务
在默认情况下,MySql每执行一条SQL语句,都是一个单独的事务。如果需要在一个事务中包含多条SQL语句,那么需要开启事务和结束事务。
①开启事务:start transaction
②结束事务:commit和rollback
在执行SQL语句之前,先执行start transaction,这就开启了一个事务(事务的起点),然后可以去执行多条SQL语句,最后要结束事务,commit表示提交,即事务中的多条SQL语句所作出的影响会持久化到数据库中。或者rollback表示回滚,之前做的多有操作都被撤销。
JDBC中的事务
Connection与事务相关的三个方法
A setAutoCommit(boolean):设置是否为自动提交事务,如果true(默认是true)则表示自动提交,也就是每条执行的SQL语句都是一个单独的事务,如果设置为false,那么就相当于开启事务了,con.setAutoCommit(false)表示开启事务!!!
B commit():表示提交事务,con.commit()表示提交事务!!!
C rollback():表示回滚事务,con.rollback()表示回滚事务!!!
Jdbc处理事务代码的格式
try{
con.setAutoCommit(false);//开启事务
....
....
con.commit();//try的最后提交事务
}catch{
con.rollback();//回滚事务
}
事务隔离级别
1、事务的并发读问题
脏读:读取到另一个事务未提交数据
不可重复读:两次读取不一致
幻读(虚读):读到另一事务已提交数据
2、并发事务问题
因为并发事务导致的问题大致有5类,其中两类是更新问题,三类是读问题。
脏读(dirty read):读到未提交更新数据,即读到了脏数据;
不可重复读(unrepeatable read):对同一记录的两次读取不一致,因为另一事务对该记录做了修改;
幻读(phantom read):对同一张表的记录查询不一致,因为另一事务插入了一条记录
不可重复读和幻读的区别:
不可重复读是读取到了另一事务的更新;
幻读是读取到了另一事务的插入(MySQL中无法测试到幻读)
3、四大隔离级别
4个等级的事务隔离级别,在相同的数据环境下,使用相同的输入,执行相同的工作,根据不同的隔离级别,可以导致不同的结果,不同事务的隔离级别能够解决的数据并发问题的能力是不同的。
1> SERIALIZABLE(串行化)
不会出现任何并发问题,因为它对同一数据的访问时串行的,非并发访问的
性能最差
2> SERIALIZABLE READ(可重复读)(MySQL)
防止脏读和不可重复读
性能比SERIALIZABLE好
3> READ COMMITTED(读已提交数据)(oracle)
防止脏读
性能比SERIALIZABLE READ好
4> READ UNCOMMITTED(读未提交数据)
可能出现任何事物并发问题
性能最好
MySQL的默认隔离级别为repeatable read,可以通过下面语句查看:
select @@tx isolation
也可以通过下面语句来设置当前连接的隔离级别:
settransaction isolationlevel[四选一]
JDBC设置隔离级别
con.setTransactionlsolation(int level)
事务总结:
事务的特性:ACID;
事务开始边界与结束边界:开始边界(con.setAutoCommit(false)),结束边界(con.commit()或
con.rollback());
多个事务并发执行时才需要考虑并发事务
1、事务的四大特性(ACID)
①原子性(Atomicity)事务中所有操作都是不可分割的原子单位,要么所有操作全部执行成功,要么全部失败。
②一致性(Consistency)事务执行后,数据库状态与其他业务规则保持一致,如转账业务,无论成功与否,参与转账的两个账号的余额之和应该是不变的。
③隔离性(Isolation)隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰。
④持久性(Durability)一旦事务提交成功,事务中所有的数据操作都必须持久化到数据库中,及时在事务提交后,数据库马上崩溃,在数据库重启时,也必须保证能通过某种机制恢复数据。
2、MySql中的事务
在默认情况下,MySql每执行一条SQL语句,都是一个单独的事务。如果需要在一个事务中包含多条SQL语句,那么需要开启事务和结束事务。
①开启事务:start transaction
②结束事务:commit和rollback
在执行SQL语句之前,先执行start transaction,这就开启了一个事务(事务的起点),然后可以去执行多条SQL语句,最后要结束事务,commit表示提交,即事务中的多条SQL语句所作出的影响会持久化到数据库中。或者rollback表示回滚,之前做的多有操作都被撤销。
JDBC中的事务
Connection与事务相关的三个方法
A setAutoCommit(boolean):设置是否为自动提交事务,如果true(默认是true)则表示自动提交,也就是每条执行的SQL语句都是一个单独的事务,如果设置为false,那么就相当于开启事务了,con.setAutoCommit(false)表示开启事务!!!
B commit():表示提交事务,con.commit()表示提交事务!!!
C rollback():表示回滚事务,con.rollback()表示回滚事务!!!
Jdbc处理事务代码的格式
try{
con.setAutoCommit(false);//开启事务
....
....
con.commit();//try的最后提交事务
}catch{
con.rollback();//回滚事务
}
事务隔离级别
1、事务的并发读问题
脏读:读取到另一个事务未提交数据
不可重复读:两次读取不一致
幻读(虚读):读到另一事务已提交数据
2、并发事务问题
因为并发事务导致的问题大致有5类,其中两类是更新问题,三类是读问题。
脏读(dirty read):读到未提交更新数据,即读到了脏数据;
不可重复读(unrepeatable read):对同一记录的两次读取不一致,因为另一事务对该记录做了修改;
幻读(phantom read):对同一张表的记录查询不一致,因为另一事务插入了一条记录
不可重复读和幻读的区别:
不可重复读是读取到了另一事务的更新;
幻读是读取到了另一事务的插入(MySQL中无法测试到幻读)
3、四大隔离级别
4个等级的事务隔离级别,在相同的数据环境下,使用相同的输入,执行相同的工作,根据不同的隔离级别,可以导致不同的结果,不同事务的隔离级别能够解决的数据并发问题的能力是不同的。
1> SERIALIZABLE(串行化)
不会出现任何并发问题,因为它对同一数据的访问时串行的,非并发访问的
性能最差
2> SERIALIZABLE READ(可重复读)(MySQL)
防止脏读和不可重复读
性能比SERIALIZABLE好
3> READ COMMITTED(读已提交数据)(oracle)
防止脏读
性能比SERIALIZABLE READ好
4> READ UNCOMMITTED(读未提交数据)
可能出现任何事物并发问题
性能最好
MySQL的默认隔离级别为repeatable read,可以通过下面语句查看:
select @@tx isolation
也可以通过下面语句来设置当前连接的隔离级别:
settransaction isolationlevel[四选一]
JDBC设置隔离级别
con.setTransactionlsolation(int level)
事务总结:
事务的特性:ACID;
事务开始边界与结束边界:开始边界(con.setAutoCommit(false)),结束边界(con.commit()或
con.rollback());
多个事务并发执行时才需要考虑并发事务