在Spring中拳恋,@Transactional注解失效,通過(guò)網(wǎng)上搜索砸捏,基本可以找到如下3個(gè)原因:
1谬运、在同一個(gè)類中隙赁,沒(méi)有@Transactional注解的方法去調(diào)用有@Transactional注解
2、@Transactional注解修飾的方法不是public的
3吩谦、拋出的異常為checked類型
但今天比較倒霉了鸳谜,@Transactional失效,都不是以上3個(gè)原因式廷。
還原一下當(dāng)時(shí)的情形:
配置文件application.properties:
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/dbgirl?useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=123456
spring.jpa.hibernate.ddl-auto=update
spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect
User實(shí)體類:
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(unique = true)
private String name;
private String company;
// 略去getter,setter
}
Service方法:
@Component
public class DemoService {
@Autowired
UserDao userDao;
@Autowired
OperationLogDao operationLogDao;
@Transactional
public void addUser(String name){
OperationLog log = new OperationLog();
log.setContent("create user:" + name);
operationLogDao.save(log);
User user = new User();
user.setName(name);
userDao.save(user);
}
}
本來(lái)想的很好芭挽,利用jpa自動(dòng)生成數(shù)據(jù)庫(kù)表結(jié)構(gòu)滑废,方便向users表插入記錄。當(dāng)重復(fù)插入同一個(gè)name的User時(shí)袜爪,會(huì)報(bào)Duplicate entry 的錯(cuò)誤蠕趁,然后導(dǎo)致回滾,但結(jié)果并沒(méi)有辛馆。
后來(lái)搜了好久俺陋,才發(fā)現(xiàn),mmp昙篙!
數(shù)據(jù)庫(kù)里表的引擎是MyISAM腊状,不支持事務(wù)處理。苔可。關(guān)鍵在于application.properties中這一行配置:
spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect
將其修改如下
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
再重新生成表后缴挖,引擎變?yōu)镮nnodb,再調(diào)用addUser方法焚辅,報(bào)錯(cuò)以后映屋,事務(wù)終于回滾了